Python中优雅的多重继承

2024-04-30 15:39:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在使用这个模式创建一个类C,它继承自AB。我无法从C调用super().__init__,因为我必须在AB中执行相同的操作,并且意外的参数将导致顶层出现问题。我觉得这不是很优雅。在Python中执行多重继承的正确方法是什么?我猜查询mro以确定超类是否需要参数是不寻常的?你知道吗

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()

Tags: selfgo参数returnabinitdef模式
1条回答
网友
1楼 · 发布于 2024-04-30 15:39:57

我找到的最佳解决方案是使用基类来吸收额外的参数:

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

相关问题 更多 >