程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

理解python多重继承中的MRO、构造函数和方法

发布于2023-02-03 21:18     阅读(329)     评论(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 CLASSpython的那个意思有__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__()

在这里,我们把事情复杂化了——我们继承自两个类:AB还调用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黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

16 0
收藏该文
已收藏

评论内容:(最多支持255个字符)