标签:containe col expand 执行 app 表示 abstract init 变化
前言:当工程师和建筑师决定建造一座桥、一座塔或一栋楼时,他们会遵循一定的原则,确保其结构的完整性,现在已经有很多的可行的桥梁设计方案,根据这些方案来处理实际问题。在软件中也是如此,通过使用不同的设计模式来解决各种普遍性的问题。
可以使用abc来创建:”抽象方法“@abstractmethod 和”抽象属性“@abstractproperty
抽象方法:表示可以不实现基类的一个方法,基类不能实例化,只有子类实现了该抽象方法才能被实例化。
from abc import ABC, abstractmethod class Foo(ABC): @abstractmethod def fun(self): ‘‘‘抽象方法,这里可以不用实现这个方法‘‘‘ class SubFoo1(Foo): # 如果想子类实例化,就必须先实现基类的抽象方法,否则会报错 pass class SubFoo2(Foo): # 这个方法就实现了基类的抽象方法,可以正常的实例化 def fun(self): print(‘fun in SubFoo2‘) s1 = SubFoo1() 结果: TypeError: Can‘t instantiate abstract class SubFoo1 with abstract methods fun 类型错误:不能用抽象方法实例化抽象类SubFoo1 s2 = SubFool2() s2.func() 结果: fun in SubFoo2 (打印执行的内容)
假如通知朋友来参加宴会为例子,使用观察者的设计模式来实现:当主题发生变化时,通过实现通知方法来告知观察者
from abc import ABC, abstractmethod class Subject: def __init__(self): self.employees = [] def add_employees(self, employee): self.employees.append(employee) def notice_all(self, message): for employee in self.employees: employee.notice(self, message) class Person(ABC): @abstractmethod def notice(self, subject, message): """通知事件,抽象化""" class Friend1(Person): def notice(self, subject, message): print("{}收到{}的消息:{}".format(type(self).__name__, type(subject).__name__, message)) class Friend2(Person): def notice(self, subject, message): print("{}收到{}的消息:{}".format(type(self).__name__, type(subject).__name__, message)) subject = Subject() p1 = Friend1() p2 = Friend2() subject.add_employees(p1) subject.add_employees(p2) subject.notice_all("通知晚上7:00 来参加我的生日宴会") # 当主题发生了变化,对应的观察者也会收到消息
结果:
Friend1收到Subject的消息:通知晚上7:00 来参加我的宴会
Friend2收到Subject的消息:通知晚上7:00 来参加我的宴会
标签:containe col expand 执行 app 表示 abstract init 变化
原文地址:https://www.cnblogs.com/su-sir/p/12525079.html