DAY 12. python新式类和旧式类

继承自object基类的类叫做新式类,否则叫做旧式类,python3中的类默认是新式类,之前版本默认是旧式类

root@kail:~# python
python 2.7.15 (default,Jul 28 2018,11:29:29)
[GCC 8.1.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class A():
...     pass
...
>>> a=A()
>>> dir(a)
['__doc__','__module__']

如上,在python2中定义一个类,不继承任何基类,内建属性只有两个,这就是旧式类,如果想要创建一个新式类,需要显式的继承object基类,如:

root@kail:~# python
python 2.7.15 (default,Jul 28 2018,11:29:29)
[GCC 8.1.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class A(object):
...     pass
...
>>> dir(A)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

新式类默认有很多属性,都是从object基类中继承过来的,而在python3中所有类默认继承object基类

Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> class A:pass
>>> dir(A)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
>>>

每个属性的具体用法参见Python——特殊属性与方法

12.1 新式类和旧式类的区别

  1. 根本区别:新式类继承自object基类,旧式类不继承任何基类
  2. MRO不同:新式类和经典类的方法解析顺序(MRO)不同,经典类使用DFS,新式类使用C3算法

python 2.7

class A():name = 'A'age = 12class B():name = 'B'class C():name = 'C'class D(A,B):name = 'D'class E(A,C):name = 'E'age = 13class F(D,E):passprint F.name  # D
print F.age  # 12

上面的继承关系是:

A,age=12
D
B
A
E,age=13
C
F

显然在age的继承上,2.7使用了DFS,我们再看3.7

python 3.7

class A():name = 'A'age = 12class B():name = 'B'class C():name = 'C'class D(A,B):name = 'D'class E(A,C):name = 'E'age = 13class F(D,E):passprint(F.name)  # D
print(F.age)  # 13

显然3.7没有使用DFS,而是在每一次寻找入度为零的节点,加入mro列表后删除这条边,再次寻找,以上面的代码为例,第一个入读为0的节点就是F,所以mro表的第一项就是F,删除F及相连的边,入度为0的就是DE,按照书写代码的顺序第二项为D,第三项为E,依次,最终所有新式类继承自object,所以最后一项就是object,继承顺序就是按mro列表的顺序来的,可以使用mro()查看mro列表

print(F.mro())
# [<class '__main__.F'>, <class '__main__.D'>, <class '__main__.E'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>]

也就是说,C3是先在水平方向上查找,再往上查找

12.2 总结

基类 MRO 备注
经典类 None DFS python2默认经典类
新式类 object C3 python3默认新式类

我尝试在python3中通过重写type元类写出经典类,但发现这样写出的类似乎不是真的经典类,只是默认属性和经典类差不多,MRO行为依旧和新式类一样,可能是我代码有问题,请各位大佬赐教

class Type(type):__bases__ = ()__base__ = None__mro__ = (None,)Foo1 = Type('Foo1',() ,{})
Foo2 = Type('Foo2', (), {})
Foo3 = Type('Foo3', (), {})
Foo4 = Type('Foo4', (Foo1, Foo2), {})
Foo5 = Type('Foo5', (Foo1, Foo3), {})
Foo6 = Type('Foo6', (Foo4, Foo5), {})if __name__ == '__main__':# base 为空时会多出两个属性,第一个与类描述有关,第二个与弱拷贝有关print(dir(Foo1))  # ['__dict__', '__doc__', '__module__', '__weakref__']print(dir(Foo2))  # ['__dict__', '__doc__', '__module__', '__weakref__']print(dir(Foo3))  # ['__dict__', '__doc__', '__module__', '__weakref__']# base 不为空时,默认属性表现的和经典类一样print(dir(Foo4))  # ['__doc__', '__module__']print(dir(Foo5))  # ['__doc__', '__module__']print(dir(Foo6))  # ['__doc__', '__module__']# 假如定义的是经典类,这里应该不能调用mro方法,但这里调用了,说明本身就不对,并且mro列表最后是object,进一步说明这还是一个新式类print(Foo1.mro())  # [<class '__main__.Foo1'>, <class 'object'>]print(Foo2.mro())  # [<class '__main__.Foo1'>, <class 'object'>]print(Foo3.mro())  # [<class '__main__.Foo1'>, <class 'object'>]print(Foo4.mro())  # [<class '__main__.Foo4'>, <class '__main__.Foo1'>, <class '__main__.Foo2'>, <class 'object'>]print(Foo5.mro())  # [<class '__main__.Foo5'>, <class '__main__.Foo1'>, <class '__main__.Foo3'>, <class 'object'>]# 清楚的看到MRO使用的是C3算法print(Foo6.mro())  # [<class '__main__.Foo6'>, <class '__main__.Foo4'>, <class '__main__.Foo5'>, <class '__main__.Foo1'>, <class '__main__.Foo2'>, <class '__main__.Foo3'>, <class 'object'>]# TODO: 如何在python3中定义经典类,还是根本不能定义,抛砖引玉,请赐教

python 经典类和新式类相关推荐

  1. Python中经典类和新式类的区别

    首先了解一下什么是经典类,什么是新式类 class Person: #经典类pass class Person2(object): #新式类pass #类名首字母都大写 #在python3里面经典类和 ...

  2. python经典类新式类_Python新式类与经典类(旧式类)的区别

    看写poc的时候看到的,思考了半天,现在解决了 转载自http://blog.csdn.net/zimou5581/article/details/53053775 Python中类分两种:旧式类和新 ...

  3. Python的面向对象,魔术方法、类的三大特征、自省、实例空间、经典类与新式类

    目录 1.什么是面向对象 1.1 面向过程 1.2 面向对象 1.3 面向对象的优点 2.类 2.1 什么是类.对象,方法和属性 2.2 类的定义和使用 2.2.1 类名规范和类的写法 2.3 魔术方 ...

  4. python 新式类 旧式类_Python新式类与经典类(旧式类)的区别

    Python中类分两种:旧式类和新式类: ➤新式类都从object继承,经典类不需要. ➤新式类的MRO(method resolution order 基类搜索顺序)算法采用C3算法广度优先搜索,而 ...

  5. python 经典类与新式类

    经典类和新式类的主要区别就是类的继承的方式 ,经典类遵循深度优先的规则,新式类遵循广度优先的规则.至于什么是深度优先什么是广度优先,可以看如下示例: class A(object):def print ...

  6. Python经典类与新式类已经经典继承和新式继承;以及继承顺序

    经典类和新式类,以及经典继承和新式继承 # class Animal: #经典类 class Animal(object): #新式类def __init__(self,name):self.name ...

  7. 经典类与新式类的继承顺序

    1 #经典类与新式类的继承顺序 2 3 class Teacher(object): 4 cn='Harvard' 5 def __init__(self,name,age,sex): 6 self. ...

  8. 多继承、经典类与新式类、新式类的C3算法详解

    多继承Python2版本class A(object) ---> 新式类class B ---> 经典类 Python3版本默认都是新式类 经典类和新式类的不同在于多继承时继承的顺序不同经 ...

  9. python经典类和新式类_python中经典类和新式类的区别

    在定义class的时候,有几种常见的写法,比如: class A: pass class B(): pass class C(object): pass 在python 2中查看以上各个class的类 ...

最新文章

  1. 《剑指offer》-- 两个链表的第一个公共结点、链表中环的入口结点、删除链表中的重复结点
  2. python代码转换为pytorch_pytorch实现Tensor变量之间的转换
  3. Unity3D Editor 扩展
  4. webstorm卡顿问题
  5. 解惑图数据库!你知道什么是图数据库吗?
  6. leetcode15 三数之和
  7. 使用GetThumbnailImage进行图片缩放操作
  8. mac mysql php_Mac下搭建PHP开发环境(Apache+PHP+MySQL+phpMyAdmin)
  9. 遇到Io阻塞时会切换任务之【爬虫版】
  10. 【UVA10129】Play on Words(欧拉回路+有向图连通性判断+打印欧拉道路)
  11. MATLAB人脸识别系统[GUI界面,完美运行,详细解析]
  12. synchronized解析
  13. 软著申请流程与方法详解
  14. 那一年马云34岁,李彦宏30岁,马化腾27岁
  15. 2022电大国家开放大学网上形考任务-民事诉讼法学非免费(非答案)
  16. 像素级图像融合常用方法
  17. raid1硬盘计算机能读取,1,如何计算各种RAID硬盘的容量? ? ?
  18. 在MTK7628平台编译Silicon的zigbee Host程序
  19. Android开发从零开始
  20. 51单片机PCF8591-AD-DA转换

热门文章

  1. Docker 实战:编写 Dockerfile
  2. 消息队列技术介绍 : ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ
  3. BUAA-OO 第二单元作业“电梯调度”总结与思考
  4. docker安装nginx容器小记
  5. study of javaserver faces lifecycle
  6. BZOJ 1567: [JSOI2008]Blue Mary的战役地图
  7. 【bzoj2132】圈地计划 网络流最小割
  8. Jenkins常用插件
  9. AI研究的盲点:无解的神经网络内在逻辑
  10. NG客制项目下的I18n国际化标准方案