zoukankan      html  css  js  c++  java
  • 经典类与新式类的继承顺序

    经典类与新式类的继承顺序--两种不同的继承策略。

    构造函数(初始化)__init__(self): 的继承策略,就是找哪个__init__(self)的问题

    当实例本身有__init__(self) 的时候,会先执行自己的)__init__(self) 函数。

    当实例本身没有__init__(self)的时候,它会去找父类中的)__init__(self)函数,此时有2种

    继承策略,一种是深度优先,一种是广度优先。

    我们看上面的图,先放两句概念上来吓唬吓唬你:

    • 当类是经典类时,多继承情况下,会按照深度优先方式查找
    • 当类是新式类时,多继承情况下,会按照广度优先方式查找

      那么什么是经典类和新式类呢?简而言之,继承自object的类就叫做新式类,object类是python提供的,现在我们还不需要管它从哪里来,因为让类中的很多操作变得更合理了,我们以后记着就这么写就对了。注:下面小伙伴提到,python3.X版本中的类继承默认就是广度优先。

      下面来说广度优先和深度优先,首先,B和C两个类都必须继承自D,A类又继承自B、C,就是针对这种情况,没有为什么。。。背下来!我们对应起来看,这里的基类D就是上例中的classmate,BC就是pythoner和female,A则对应fe_pythoner类。

      经典类中:当我们这样写:fe_pythoner(pythoner,female),对象调用方法的时候,会先在fe_pythoner里面找,然后依次去找pythoner、classmate、最后再找female。如果找到了,就会执行,并且不再继续找下去了。所以我们刚刚在左侧举出得栗子中它先找到了classmate中的drink方法,才打印出了同样的内容。这就是深度优先。

      新式类中:当我们这样写:fe_pythoner(pythoner,female),对象调用方法的时候,会先在fe_pythoner里面找,然后依次去找pythoner、female、最后再找classmate。如果找到了,就会执行,并且不再继续找下去了。所以我们刚刚在右侧举得栗子中它先找到了female、或male中的drink方法,就打印了不同的内容。这就是广度优先。

    class classmate(object):
        def __init__(self,name):
            self.name = name
    
        def eat(self):
            print '%s is eating.'%self.name
    
        def drink(self):
            print '%s is drinking'%self.name
    
    class female(classmate):
    
        def drink(self):
            print '%s drink orange juice'%self.name
    
    class male(classmate):
    
        def drink(self):
            print '%s drink alcohol'%self.name
    
    class pythoner(classmate):
    
        def occupation(self):
            print '%s is a pythoner.'%self.name
    
    
    
    class fe_pythoner(pythoner,female):
        pass
    class male_pythoner(pythoner,male):
        pass
    
    eva = fe_pythoner('eva')
    eva.drink()
    
    sweet = male_pythoner('sweet')
    sweet.drink()
    
    example Code
    

     如果上面那些你通通没搞清楚,也没关系,在继承的时候可以直接把female类写在前面 fe_pythoner(female,pythoner),这么一来不管怎么样,都是先找female了。

    总结:python2的经典类是按照深度优先来继承的,新式类( 包含object字样的) 是按照广度优先来继承的。

               python3 经典类和新式类都是统一按照广度优先来继承的。

  • 相关阅读:
    善用性能工具进行SQL整体优化
    mysql use index () 优化查询的例子
    mysql优化 explain index
    mysql中explain用法和结果的含义
    MySQL运行状态show status中文详解
    Mysql运行状态查询命令及调优详解
    数据库工具——Navicat Premium使用技巧
    细说mysql索引
    对国家失望:汉末儒生集体沉默(儒家主张积极入世,以经国济世为己任的)
    韦尔股份:打造国际半导体设计行业领先企业(各种企业问题的问答)
  • 原文地址:https://www.cnblogs.com/momo8238/p/7255378.html
Copyright © 2011-2022 走看看