【发布时间】:2020-09-13 10:02:47
【问题描述】:
我有一个相当大的班级,我想将其分解为较小的班级,每个班级处理整体的一个部分。所以每个孩子只关心整体的一个方面。
这些子类中的每一个仍然需要相互通信。 例如,数据访问创建了一个绘图控制器需要访问的字典。 然后绘图控制器需要更新主 GUI 控制器上的内容。但是这些孩子有更多的相互交流的功能。
我如何做到这一点?
我读过Metaclasses、Cooperative Multiple Inheritence 和Wonders of Cooperative Multiple Inheritence,但我不知道该怎么做。
我最接近的是以下代码:
class A:
def __init__(self):
self.myself = 'ClassA'
def method_ONE_from_class_A(self, caller):
print(f"I am method ONE from {self.myself} called by {caller}")
self.method_ONE_from_class_B(self.myself)
def method_TWO_from_class_A(self, caller):
print(f"I am method TWO from {self.myself} called by {caller}")
self.method_TWO_from_class_B(self.myself)
class B:
def __init__(self):
self.me = 'ClassB'
def method_ONE_from_class_B(self, caller):
print(f"I am method ONE from {self.me} called by {caller}")
self.method_TWO_from_class_A(self.me)
def method_TWO_from_class_B(self, caller):
print(f"I am method TWO from {self.me} called by {caller}")
class C(A, B):
def __init__(self):
A.__init__(self)
B.__init__(self)
def children_start_talking(self):
self.method_ONE_from_class_A('Big Poppa')
poppa = C()
poppa.children_start_talking()
正确的结果是:
I am method ONE from ClassA called by Big Poppa
I am method ONE from ClassB called by ClassA
I am method TWO from ClassA called by ClassB
I am method TWO from ClassB called by ClassA
但是……即使 Class B 和 Class A 正确地调用了其他子函数,它们实际上并没有找到它们的声明。我在输入代码时也没有“看到”它们,这既令人沮丧又担心我可能做错了什么。
有没有好的方法来实现这一点?或者这实际上是个坏主意?
编辑:Python 3.7 如果有任何区别。
【问题讨论】:
-
找到他们的声明是什么意思?我不明白你的解决方案有什么问题。
-
表示在Class B中我写self.除了Class B,没有显示其他任何类的功能。在第二张图中可以清楚地看到它显示该函数的“未解析的属性引用”,该函数存在于类 A 中。这是一张图像,显示它无法“看到”其他子类的方法。 i.imgur.com/YkmFb92.png 甚至认为它存在于那里,并且正确地调用它。
-
为什么你认为 self 应该显示其他类方法?您是打算继承这些类,还是应该包含彼此的实例?
-
第一个模式是关于协作对象的高级建模。美好的。但是你想把什么遗产放在那里?请记住,继承是一个 is a 关系,看起来你在这里使用了错误的工具。
标签: python class design-patterns multiple-inheritance