【发布时间】:2016-09-17 18:26:06
【问题描述】:
我正在尝试使用 Mixins、MyCollection、Val5、Val10 创建具体类 Val15。 Val15 正在尝试从 MyCollection 继承 values。当Val15 被实例化时,我试图同时调用Val10 和Val5 的value 并将它们添加到Val15、values。
但是,事实证明Val15 将仅继承Val10 的值,并且所有类都将调用Val10 的值。你究竟如何才能推翻这个问题?
class MyCollection(object):
def __init__(self):
super().__init__()
self.values = []
class MyMessage(object):
def __init__(self):
super().__init__()
def message(self):
print('Hello World')
class Val10(object):
def __init__(self):
super().__init__()
print('Call 10')
self.values.append(self.value())
def value(self):
print('Value 10')
return 10
class Val5(object):
def __init__(self):
super().__init__()
print('Call 5')
self.values.append(self.value())
def value(self):
print('Value 5')
return 5
class Val15(Val10, Val5, MyMessage, MyCollection):
def __init__(self):
super().__init__()
def my_sum(self):
return sum(self.values)
val15 = Val15()
val15.my_sum()
val15.message()
# Result:
# Call 5
# Value 10
# Call 10
# Value 10
# Hello World
【问题讨论】:
-
这是为数不多的两个前导双下划线实际上有意义的情况之一,以避免这种冲突(参见例如docs.python.org/3/tutorial/classes.html#private-variables)。
-
我尝试对两个班级都这样做,但我仍然遇到同样的问题。
-
问题是
self总是一个Val15,所以它自己的方法是先在MRO中。在不明确的情况下(self.values.append(Val10.value(self))或在各个地方调用super,这是您应该期待的行为。 -
我认为你需要重新考虑你的类的结构。例如,
val15.value()应该打印什么,它应该返回什么值?它应该同时打印5和10还是只打印15,或者这两个选项都不打印?
标签: python inheritance mixins