[英]understanding MRO, constructors, and methods in multiple inheritance of python
以下是两组代码:一组具有构造函数__init__()
,另一组具有display()
方法。
代码一:
class A(object):
def __init__(self):
self.a = "a"
print(self.a)
super().__init__()
class B(object):
def __init__(self):
self.b = "b"
print(self.b)
super().__init__()
class C(A,B):
def __init__(self):
self.c = "c"
print(self.c)
super().__init__()
o = C()
print(C.mro())
如果我们编译并运行上面的这组代码,output 将是:
c
a
b
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
现在,第二个代码块在下面,
class A(object):
def display(self):
self.a = "a"
print(self.a)
super().display()
class B(object):
def display(self):
self.b = "b"
print(self.b)
super().display()
class C(A,B):
def display(self):
self.c = "c"
print(self.c)
super().display()
o = C()
o.display()
print(C.mro())
如果在上面的第二个代码块中,我们将__init__()
替换为display()
方法,那么,由于class B
中的 super(). super().display()
() ,如果我们在class B
中删除super().display()
,也会显示错误他们不会出错
AttributeError: 'super' object has no attribute 'display'
据我所知,因为OBJECT class
中没有display()
方法。 但是在第一段代码中,代码运行没有错误。
这是否意味着OBJECT CLASS
的 OBJECT CLASS 中有__init__()
?
如果不是,请解释为什么他们在第一段代码中没有错误,但在第二段代码中却有错误?
让我们分解这段代码:
class A(object):
def __init__(self):
self.a = "a"
print(self.a)
super().__init__()
class B(object):
def __init__(self):
self.b = "b"
print(self.b)
super().__init__()
这是 Python 中的常规 class,无需详细说明 - 它继承自object
-(在Python3 中是多余的)它调用super().__init__()
转换为object().__init__()
- 每个 class Python 继承自object
- 我们可以通过调用方法解析顺序并注意列表中的<class 'object'>
(最后一个元素/唯一元素)来查看它。 class B
同样的故事。
class C(A,B):
def __init__(self):
self.c = "c"
print(self.c)
super().__init__()
这里我们把事情复杂化了——我们继承自两个类: A
和B
还调用super().__init__()
- 调用A.__init__()
和B.__init__()
- 因此按您看到的顺序打印: c, a, b
。
这就是事情破裂的地方。
class A(object):
def display(self):
self.a = "a"
print(self.a)
super().display()
这又是 Python 中的常规 class 和 object 中的冗余 inheritance class - 但现在我们正在调用super().display()
- 转换为object().display()
- 该方法不存在:
>>> object().__init__()
None
>> object.display()
AttributeError: type object 'object' has no attribute 'display'
是的, object
class 确实有__init__()
,这里是:
def __init__(self): # known special case of object.__init__
""" Initialize self. See help(type(self)) for accurate signature. """
pass
不,它没有.display()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.