在Python中从两个不同的类重载方法的更好方法

时间:2017-09-03 23:08:54

标签: python python-3.x oop

我有两个我无法重新定义的父类(比如AB),我需要使用完全相同的方式重载方法(以便获得,比如{{1}和BetterA)。 我可以复制这两个类的代码,但我对此不满意。 在Python 3.6中,我认为我可以使用多继承和提供者类来摆脱这种情况。 这是我到目前为止所获得的:

BetterB

这很有效,但不是很优雅...... 特别是,如果我想覆盖更多方法(总是以同样的方式),我必须在# here are the initial classes I cannot edit class A: def __init__(self, a=0): self.a = a class B: def __init__(self, b=0): self.b = b # here is the provider class class Provider: def __init__(self, c, *args, **kwargs): self.c = c # more code here self.init_child(*args, **kwargs) # here are the new classes class BetterA(Provider, A): def init_child(self, *args, **kwargs): A.__init__(*args, **kwargs) class BetterB(Provider, B): def init_child(self, *args, **kwargs): B.__init__(*args, **kwargs) if __name__ == '__main__': a = BetterA(8, a=10) b = BetterB(10, b=8) BetterA中回忆它们。

如果有更好的方法来实现我想要的目标?

1 个答案:

答案 0 :(得分:2)

super()适用于多重继承:

# here is the provider class
class Provider:
    def __init__(self, c, *args, **kwargs):
        self.c = c

        # more code here

        super().__init__(*args, **kwargs)

# here are the new classes
class BetterA(Provider, A):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

class BetterB(Provider, B):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

if __name__ == '__main__':
    a = BetterA(8, a=10)
    b = BetterB(10, b=8)

如果除了调用super方法之外没有做任何事情,则无需重新定义Better*.__init__

# here are the new classes
class BetterA(Provider, A):
    pass

class BetterB(Provider, B):
    pass

根据您是否需要在Better*类型中实现更多功能,您可能更喜欢的另一个选项是创建类的功能:

def provided(cls):
    class Provided(cls):
        def __init__(self, c, *args, **kwargs):
            self.c = c

            # more code here

            super().__init__(*args, **kwargs)

    return Provided


BetterA = provided(A)
BetterB = provided(B)