假设我有一个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可以使用containertrait事件(方法)内部引用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/

10-12 23:11