python3中具有不同签名的多重继承
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python3中具有不同签名的多重继承,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2337字,纯文字阅读大概需要4分钟。
内容图文
![python3中具有不同签名的多重继承](/upload/InfoBanner/zyjiaocheng/702/d6dc0bf4eec04b3593dde1e4298bed0e.jpg)
我有三个班:A,B和C.
C继承自A和B(按此顺序). A和B的构造函数签名是不同的.如何调用两个父类的__init__方法?
我在代码中的努力:
class A(object):
def __init__(self, a, b):
super(A, self).__init__()
print('Init {} with arguments {}'.format(self.__class__.__name__, (a, b)))
class B(object):
def __init__(self, q):
super(B, self).__init__()
print('Init {} with arguments {}'.format(self.__class__.__name__, (q)))
class C(A, B):
def __init__(self):
super(A, self).__init__(1, 2)
super(B, self).__init__(3)
c = C()
产生错误:
Traceback (most recent call last):
File "test.py", line 16, in <module>
c = C()
File "test.py", line 13, in __init__
super(A, self).__init__(1, 2)
TypeError: __init__() takes 2 positional arguments but 3 were given
我发现this resource用不同的参数集解释了多重继承,但他们建议使用* args和** kwargs来用于所有参数.我认为这非常难看,因为我无法从子类中的构造函数调用中看到我传递给父类的哪种参数.
解决方法:
除非你知道自己在做什么,否则不要使用super(baseclass,…). super()的第一个参数告诉它在查找下一个要使用的方法时要跳过哪个类.例如. super(A,…)将查看MRO,找到A,然后开始在下一个基类上查找__init__,而不是A本身.对于C,MRO是(C,A,B,对象),所以super(A,self).__ init__将找到B .__ init__.
对于这些情况,您不希望使用协作继承,而是直接引用A .__ init__和B .__ init__.只有在您调用的方法具有相同的签名或者使用* args和** vargs吞下不支持的参数时,才应使用super().在这种情况下,只需要一个超级(C,self).__ init __()调用,并且MRO命令中的下一个类将负责处理呼叫.
换句话说:当你使用super()时,你无法知道MRO中接下来会是什么类,所以这个类更好地支持你传递给它的参数.如果不是这样,请不要使用super().
直接调用基__init__方法:
class A(object):
def __init__(self, a, b):
print('Init {} with arguments {}'.format(self.__class__.__name__, (a, b)))
class B(object):
def __init__(self, q):
print('Init {} with arguments {}'.format(self.__class__.__name__, (q)))
class C(A, B):
def __init__(self):
# Unbound functions, so pass in self explicitly
A.__init__(self, 1, 2)
B.__init__(self, 3)
使用合作super():
class A(object):
def __init__(self, a=None, b=None, *args, **kwargs):
super().__init__(*args, **kwargs)
print('Init {} with arguments {}'.format(self.__class__.__name__, (a, b)))
class B(object):
def __init__(self, q=None, *args, **kwargs):
super().__init__(*args, **kwargs)
print('Init {} with arguments {}'.format(self.__class__.__name__, (q)))
class C(A, B):
def __init__(self):
super().__init__(a=1, b=2, q=3)
内容总结
以上是互联网集市为您收集整理的python3中具有不同签名的多重继承全部内容,希望文章能够帮你解决python3中具有不同签名的多重继承所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。