简体   繁体   中英

Elegant multiple inheritance in Python

I'm currently using this pattern to create a class C that inherits from A and B . I couldn't call super().__init__ from C since I would have to do the same in A and B , and the unexpected parameter would cause problems at the top level. I feel like this isn't very elegant. What is the proper way to do multiple inheritance in Python? I guess it is unusual to query the mro to find out if the superclass expects a parameter?

class A:
    def __init__(self, something):
        self.a = X(something)

    def method_a(self):
        self.a.go()

    def method_ab(self):
        self.a.go2()


class B:
    def __init__(self, something):
        self.b = X(something)

    def method_b(self):
        self.b.go()

    def method_ab(self):
        self.b.go2()


class C(A, B):
    def __init__(self, something):
        self.a_ = A(something)
        self.b_ = B(something)

    @property
    def a(self):
        return self.a_.a

    @property
    def b(self):
        return self.b_.b

    def method_ab(self):
        for x in [self.a, self.b]:
            x.method_ab()

The best solution I found was to use a base class to absorb the extra parameters:

class Base:
    def __init__(self, something):
        pass

    def method_ab(self):
        pass

class A(Base):
    def __init__(self, something):
        super().__init__(something)
        self.a = X(something)

    def method_a(self):
        self.a.go()

    def method_ab(self):
        super().method_ab()
        self.a.go()


class B(Base):
    def __init__(self, something):
        super().__init__(something)
        self.b = X(something)

    def method_b(self):
        self.b.go()

    def method_ab(self):
        super().method_ab()
        self.b.go()


class C(A, B):
    pass

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM