• python的__mro__与__slot__


    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__的合集。

  • 相关阅读:
    洛谷 P2969 [USACO09DEC]音符Music Notes
    洛谷 P2646 数数zzy
    洛谷 P1605 迷宫
    洛谷 P1157 组合的输出
    洛谷 P1449 后缀表达式
    洛谷 P1205 [USACO1.2]方块转换 Transformations
    洛谷 P1599 结算日
    洛谷 P2909 [USACO08OPEN]牛的车Cow Cars
    洛谷 P2118 比例简化
    3.2、spark集群运行应用之第三方jar的处理方式
  • 原文地址:https://www.cnblogs.com/harelion/p/4869346.html
Copyright © 2020-2023  润新知