我有两个我无法重新定义的父类(比如A
和B
),我需要使用完全相同的方式重载方法(以便获得,比如{{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
中回忆它们。
如果有更好的方法来实现我想要的目标?
答案 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)