python的__mro__与__slot__

python

python支持多重继承,在解析父类的__init__时,定义解析顺序的是子类的__mro__属性,内容为一个存储要解析类顺序的元组。

class A(object):

def __init__(self):

print ' -> Enter A'

print ' <- Leave A'

class B(A):

def __init(self):

print ' -> Enter B'

# A.__init__(self)

super(B, self).__init__()

print ' <- Leave B'

class C(A):

def __init__(self):

print " -> Enter C"

# A.__init__(self)

super(C, self).__init__()

print " <- Leave C"

class D(B, C):

def __init__(self):

print " -> Enter D"

# B.__init__(self)

# C.__init__(self)

super(D, self).__init__()

print " <- Leave D"

if __name__ == "__main__":

d = D()

print "MRO:", [x.__name__ for x in D.__mro__]

print type(D.__mro__)

执行以上代码,得到的输出为:

-> Enter D
-> Enter C
-> Enter A
<- Leave A
<- Leave C
<- Leave D
MRO: ['D', 'B', 'C', 'A', 'object']
<type 'tuple'>

与之前一篇文章中的内容不同,类B并没有被执行,也许是因为没有显式调用,而C与B有相同父类。

尽量避免使用非绑定方法,可能会造成重复调用。

关于__slot__

__slot__定义类中可以被外界访问的属性,类似node中的exports。

当父类中定义了__slot__时,不能向父类中添加属性。如果子类中没有定义__slot__,则子类不受父类__slot__定义的限制。

如果父类与子类中都定义了__slot__,则邮箱的结果为父类与子类__slot__的合集。

以上是 python的__mro__与__slot__ 的全部内容, 来源链接: utcz.com/z/388944.html

回到顶部