发布于2023-02-03 21:18 阅读(264) 评论(0) 点赞(16) 收藏(3)
以下是两组代码:一组有构造函数__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())
如果我们编译并运行上面的这组代码,输出将是:
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()
方法替换,那么,因为super().display()
in class B
,错误也会显示,如果我们删除super().display()
inclass B
他们将不会出错
AttributeError: 'super' object has no attribute 'display'
我明白了,因为里面OBJECT class
没有display()
方法。
但是在第一段代码中,代码运行没有错误。
OBJECT CLASS
python的那个意思有__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 中的一个常规类,无需详细说明 - 它继承自object
- (在Python3 中是多余的)它调用一个 thesuper().__init__()
转换为object().__init__()
- Python 中的每个类都继承自object
- 我们可以通过调用方法解析顺序和<class 'object'>
在列表中注意(最后一个元素/唯一元素)。同样的故事上课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 中的常规类,具有从对象类的冗余继承 - 但现在我们正在调用super().display()
- 转换为object().display()
- 该方法不存在:
>>> object().__init__()
None
>> object.display()
AttributeError: type object 'object' has no attribute 'display'
是的,该object
课程确实有__init__()
,这里是:
def __init__(self): # known special case of object.__init__
""" Initialize self. See help(type(self)) for accurate signature. """
pass
不,它没有.display()
。
作者:黑洞官方问答小能手
链接:https://www.pythonheidong.com/blog/article/1895306/38032b01321aec478b75/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!