I have the following problem:
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__()
Now, I want a certain set of subclasses from A, to implement a new function that calculates something different with the animal, like so:
class CapitalizeAnimal:
def cal开发者_如何转开发culate_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__()
How do I get class C
to implement the CapitalizeAnimal
version of calculate_animal
, while keeping its animal as puma
? I'm confused at how the Mixin class will be able to call a super() function.
The order of the parent classes is important, you should do it like so:
class C(CapitalizeAnimal, A):
animal = 'puma'
def __init__(self):
super(C, self).__init__()
More info can be found by reading about the MRO (Method Resolution Order).
Also, super
only works with new style classes, so you should make A inherit object
(unless of course you are using Python 3).
First of all, B
and C
don't need __init__()
if the only action is calling the super __init__
.
To your question: Have you tried class C(A, CapitalizeAnimal):
and/or class C(A, CapitalizeAnimal):
? I.e., omitting the #
and the ?
?
精彩评论