zoukankan      html  css  js  c++  java
  • 面向对象之新式类、经典类,多继承环境下 类 寻找成员的方式

    一、什么是经典类,什么新式类?

    经典类、新式类是站在类否继承 object 类的前提下的一个命名, 一个概念。

    1.1 定义:

    经典类: 当前类没有继承 object  类,那么当前类就是 经典类。

    新式类:当前类继承 object 类,那么当前类就是 新式类。

    1.2 在ptyhon的不同版本中,经典类与新式类的存在情况不一样

    1.2.1 在 python3.X 版本中,由于所有的类 默认都继承 object类,所以有的类 都是 新式类。

      结论:在python3.x版本中,只有新式类

    解释器为python3.6 环境
    class
    Person1:pass # 默认继承 object 类 class Person2(object):pass print(Person1.__bases__) # (<class 'object'>,) print(Person2.__bases__) # (<class 'object'>,) print(Person1.__dict__) # 返回一个字典,字典中存放了 类的所有属性和值

    1.2.2 在python2.7 版本中,所有的类 ,默认都不继承 object 类,所以默认情况下,类就是经典类,如果显示声明一个类 继承 object 类,或者 一个类 通过 继承关系的传递 继承了object类,那么就成为新式类。

       结论:在python 2.7 版本中,经典类和新式类 并存

    # 以下是在python2.7环境中执行的命令结果:
    class Person3: pass         # 默认不继承(不主动) object 类
    print(Person3.__bases__)   # ()
    
    class Person4(object):pass   # 显示声明一个类 继承 object 类
    print(Person4.__bases__)  #  (<type 'object'>,)
    
    class Base:
        def func(self):
            print("我是Base类")
    class child:
        def func(selfself):
            print("我是child类")
    print(issubclass(child,object))  # False  在python2.7 中,在默认情况下 ,都不继承 object类,是经典类
    print(issubclass(Base,object))   # False
    
    class Base(object):   # 显示声明一个类 继承 object 类
        def func(self):
            print("我是Base类")
    class child(Base):
        def func(selfself):
            print("我是child类")
    print(issubclass(child,object))  # True  可见继承具有传递性
    print(issubclass(Base,object))   # True

     1.3 当类是 经典类 或者 新式类  时,在多继承环境下,从父类中寻找 成员的顺序问题,或者叫找寻父类成员的方式:

       1.3.1 当类是 经典类 时,在多继承环境下,会按照 深度优先方式 查找:

    # 经典类,在多继承环境,在父类中寻找成员的方式,遵循 “深度优先” 原则
    class G:
        # def find(self):
        #     print("G")
        pass
    class A:
        # def find(self):
        #     print("A")
        pass
    
    class B(A):
        # def find(self):
        #     print("B")
        pass
    class C(A):
        # def find(self):
        #     print("C")
        pass
    class D(B,G):
        # def find(self):
        #     print("D")
        pass
    class E(C):
        # def find(self):
        #     print("E")
        pass
    class F(D,E):
        # def find(self):
        #     print("F")
        pass
    
    f_obj = F()
    f_obj.find()   # F --> D --> B --> A --> G --> E --> C -->

       

      总结:“深度优先”查找方式,从当前类开始查找 成员属性或方法 ,当前类没有,则查找 第一个继承的父类 ,若没有,则查找父类的父类,沿着父类的父类....,一直查找下去,查找到到就执行,若一直查找到了最顶层的类,则沿原路返回,看有没有未查找的节点,左树枝查找完毕没有,则回到 当前类 这个根节点,查找第二个直接继承的节点,的右树枝。依次类推。

    1.3.2  当前类 是 新式类 时, 在多继承环境下,查找父类的成员时,会遵循 “广度优先”方式 查找:

     

     结论: 当 尝试 从B的父类 A 查找成员时,由于A 有两条路径,可以达到,直接回到 F 类,开始另一个分支的查找

    ==

     

    ==

    ---

    ----

     

    ==

    ====

    1.4 经典类和新式类的特点:

    1.4.1 新式类:

      所有的多继承关系寻找 方法的顺序  --- 遵循广度优先算法

      继承object

           mro方法

      super(); super 不是单纯的找父类,而是遵循mro顺序

    1.4.2 经典类

      不主动继承object

      经典类在找父类方法的过程中,遵循 深度优先

      不提供mro方法 和  super

  • 相关阅读:
    go 语言之fmt.Sprintf格式化使用
    golang 中string和int类型相互转换
    GO 获取时间的日期函数、时间戳函数
    go 字符串切割方法小结
    php获取中英文字符串字符长度mb_strlen,字节长度strlen
    linux 之 grep 命令
    linux 无界面环境安装chrome,chromedriver,selenium
    kafka 常用命令总结
    linux中系统中 /bin、/sbin、/usr/bin、/usr/sbin、/usr/local/bin、/usr/local/sbin 目录的含义及区别
    3306端口被占用导致MySQL无法启动
  • 原文地址:https://www.cnblogs.com/chris-jia/p/9554907.html
Copyright © 2011-2022 走看看