繁体   English   中英

了解 python 的多个 inheritance 中的 MRO、构造函数和方法

[英]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__()

这里我们把事情复杂化了——我们继承自两个类: 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 中的常规 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM