我有以下问题:
class A:
animal = 'gerbil'
def __init__(self):
self.result = self.calculate_animal()
def calculate_animal(self):
print(self.animal)
return self.animal
class B(A):
animal = 'zebra'
def __init__(self):
super(B, self).__init__()
现在,我想要一组来自A的子类来实现一个计算与动物不同的东西的新函数,如下所示:
class CapitalizeAnimal:
def calculate_animal(self):
self.animal = self.animal.upper()
# I need to call some version of super().self.animal,
# but how will this Mixin class know of class A?
class C(A, #CapitalizeAnimal?):
animal = 'puma':
def __init__(self):
super(C, self).__init__()
如何让class C
实施CapitalizeAnimal
calculate_animal
版puma
,同时将动物保持为{{1}}?我对Mixin类如何调用super()函数感到困惑。
答案 0 :(得分:5)
父类的顺序很重要,你应该这样做:
class C(CapitalizeAnimal, A):
animal = 'puma'
def __init__(self):
super(C, self).__init__()
通过阅读MRO(方法解析顺序),可以找到更多信息。
此外,super
仅适用于new style classes,因此您应该使A继承object
(当然,除非您使用的是Python 3)。
答案 1 :(得分:0)
首先,如果唯一的操作是调用超级B
,则C
和__init__()
不需要__init__
。
问答:您是否尝试过class C(A, CapitalizeAnimal):
和/或class C(A, CapitalizeAnimal):
?即,省略#
和?
?