我正在尝试使用Mixins,Val15
,MyCollection
,Val5
创建具体的课程Val10
。 Val15
正试图从values
继承MyCollection
。在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
答案 0 :(得分:1)
这是有趣的部分:
class Val10(object):
def value(self):
return 10
class Val5(object):
def value(self):
return 5
获得父母的总和'值,你必须调用每个值:
class Val15(Val10, Val5):
def value(self):
return Val10.value(self) + Val5.value(self)
另一种方法是定义value
总是返回所有继承值的总和,无论它们是什么,而不知道哪些父类' value
致电:
class Val10:
def value(self):
previous = getattr(super(), 'value', lambda: 0)()
return previous + 10
class Val5:
def value(self):
previous = getattr(super(), 'value', lambda: 0)()
return previous + 5
class Val15(Val10, Val5):
def value(self):
return getattr(super(), 'value', lambda: 0)()
Val15().value() # 15
此解决方案不会对将要配置继承的方式做出任何假设。
<强>说明:强>
super()
语法getattr(super(), 'value', lambda: 0)
返回父类的绑定value
方法(如果存在),或者默认为返回0的函数。