zoukankan      html  css  js  c++  java
  • python 基础——多重继承

    原始的初始化

    子类直接调用超类 __init__ 方法初始化,当形成钻石继承的时候,超类会被多次初始化,可能会有意向不到的问题:

                             BaseClass

                             /        

                        OneClass    TwoClass

                                     /

                             TestClass

    from pprint import pprint
    
    class BaseClass(object):
        def __init__(self, a):
            # value = a
            self.value = a
            
    class OneClass(BaseClass):
        def __init__(self, a):
            BaseClass.__init__(self, a)
            # value + 2
            self.value += 2
            
    class TwoClass(BaseClass):
        def __init__(self, a):
            BaseClass.__init__(self, a)
            # value * 2
            self.value *= 2
            
    class TestClass(TwoClass, OneClass):
        def __init__(self, a):
            TwoClass.__init__(self, a)
            OneClass.__init__(self, a)
            # value + 8
            self.value += 8
            print self.value
            
    pprint(TestClass.mro())
    test = TestClass(3)    # 13
    # 初始化的过程是:BaseClass ——> TwoClass ——> BaseClass ——> OneClass ——> TestClass
    # value 的变化: value = 3 ——>  value = 6 ——> value = 3 ——> value = 5 ——> value = 13

    新类初始化

    使用 super 可以解决超类重复初始化的问题,保证超类只被初始化一次:

    from pprint import pprint
    
    class BaseClass(object):
        def __init__(self, a):
            # value = a
            self.value = a
            
    class OneClass(BaseClass):
        def __init__(self, a):
            super(OneClass, self).__init__(a)
            # value + 2
            self.value += 2
            
    class TwoClass(BaseClass):
        def __init__(self, a):
            super(TwoClass, self).__init__(a)
            # value * 2
            self.value *= 2
            
    class TestClass(TwoClass, OneClass):
        def __init__(self, a):
            super(TestClass, self).__init__(a)
            # value + 8
            self.value += 8
            print self.value
            
    pprint(TestClass.mro())
    """
    以以下相反的顺序初始化子类
    [<class 'TestClass'>,
     <class 'TwoClass'>,
     <class 'OneClass'>,
     <class 'BaseClass'>,
     <type 'object'>]
    """
    test = TestClass(3)    # 18
    # 初始化的过程是:BaseClass ——> OneClass ——> TwoClass ——> TestClass
    # value 的变化: value = 3 ——> value = 5 ——> value = 10 ——> value = 18
  • 相关阅读:
    NHibernate4使用Oracle.ManagedDataAccess.dll连接oracle及配置多个数据库连接
    Myeclipse闪退故障
    Log4j快速使用精简版
    Eclipse快捷键 10个最有用的快捷键
    Java compiler level does not match解决方法
    ArcMap常用VBA
    firefox浏览器中silverlight无法输入问题
    C#导入Excel遇到数字字母混合列数据丢失解决
    ArcMap计算PolyLine中点VBA
    Apple Watch 开发详解
  • 原文地址:https://www.cnblogs.com/licongyu/p/5818216.html
Copyright © 2011-2022 走看看