开发者

Python Multiple Inheritance/Mixin

开发者 https://www.devze.com 2023-03-29 03:23 出处:网络
I have the following problem: class A: animal = \'gerbil\' def __init__(self): self.result = self.calculate_animal()

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 ??

0

精彩评论

暂无评论...
验证码 换一张
取 消