假设我有一个python类:Foo(),它具有一个成员self.bar,该成员在Foo()初始化时被分配为Bar()的实例。所以像这样:
class Foo:
def __init__(self):
self.bar = Bar()
self.other_member = 0
然后说我将Bar()的某些方法绑定到信号/回调,并且在触发(外部)时,我希望它对Foo()的其他成员进行更改。
我的问题是:这是一件疯狂的事情吗?如果没有,那么在实现这样的东西时是否有建议的模式可以遵循?
最佳答案
U可以使用Inheritance
建立Trait
行为,并将新创建的container objects
注册到Trait static variables
。
在此示例中:
父class Trait
是所有逻辑所在的位置。
定义从child classes
继承的Trait
中特定于特征的行为,例如Trait_Meow
。
使用组合将每个animal class
绑定到其traits
。
U可以使用container
从trait
事件(方法)内部引用Cat类的self.animal()
对象。
from weakref import WeakSet, ref as weakref
class Trait:
def register_animal(self):
try:
self.__class__.live_animals.add(self)
except AttributeError as e:
self.__class__.live_animals = WeakSet([self])
def __init__(self, animal):
self.animal = weakref(animal)
self.register_animal()
class Trait_Meow(Trait):
def meow(self):
print('{} says: meoooooow'.format(self.animal().name))
def all_meow():
for animal in Trait_Meow.live_animals:
animal.meow()
class Cat:
def __init__(self, name):
self.name = name
self.traits = set([Trait_Meow(self)])
if __name__ == '__main__':
cat1 = Cat('cat1')
cat2 = Cat('cat2')
Trait_Meow.all_meow()
# output
# cat2 says: meoooooow
# cat1 says: meoooooow
关于python - 当通过成分关联对象时,使用哪种模式来促进对象之间的通信,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57549238/