新式类与经典类的区别:

首先:

Python 2.x中默认都是经典类,只有显式继承了object才是新式类

Python 3.x中默认都是新式类,不必显式的继承object

即:新式类都从object继承,经典类不需要

其次:

------新式类对象可以直接通过__class__属性获取自身类型:type

------继承搜索的顺序发生了改变

经典类多继承属性搜索顺序: 先深入继承树左侧,再返回,开始找右侧 —— 即 经典类深度优先

新式类多继承属性搜索顺序: 先水平搜索,然后再向上移动               —— 即 新式类广度优先

------新式类增加了__slots__内置属性, 可以把实例属性的种类锁定到__slots__规定的范围之中

------新式类增加了__getattribute__方法

------新式类相同父类只执行一次构造函数,经典类重复执行多次。

1、新式类对象可以直接通过__class__属性获取自身类型(type)

 1 #-*- coding:utf-8 -*-
 2 #
 3 class E1(object):
 4     pass
 5
 6 print('new_style class')
 7 e1 = E1()
 8 print(e1)
 9 print(e1.__class__)
10 print(type(e1))
11
12 '''
13 new_style class
14 <__main__.E1 object at 0x7f76acfc2320>
15 <class '__main__.E1'>
16 <class '__main__.E1'>
17
18 '''

new_style class

 1 # -*- coding:utf-8 -*-
 2 #
 3
 4 class E:
 5     pass
 6
 7 e = E()
 8 print('classic class')
 9 print(e)
10 print(type(e))
11 print(e.__class__)
12
13 '''
14 classic class
15 <__main__.E instance at 0x7f31b429afc8>
16 <type 'instance'>
17 __main__.E
18
19 '''

classic class

在Python2.7下运行,E1是定义的新式类。那么输出e1的时候,不论是type(e1),还是e1.__class__都是输出的<class '__main__.E1'>。

2、经典类深度优先,新式类广度优先

 1 #-*- coding:utf-8 -*-
 2 #
 3
 4 class A(object):
 5     '''
 6     新式类,作为所有类的基类
 7     '''
 8     def foo(self):
 9         print('class A')
10
11 class A1:
12     '''
13     经典类,作为所有类的基类
14     '''
15     def foo(self):
16         print('class A1')
17
18 class C(A):
19     pass
20
21 class C1(A1):
22     pass
23
24 class D(A):
25     def foo(self):
26         print('class D')
27
28 class D1(A1):
29     def foo(self):
30         print('class D1')
31
32 class E(C, D):
33     pass
34
35 class E1(C1, D1):
36     pass
37
38
39 e = E()
40 e.foo()
41 e1 = E1()
42 e1.foo()
43
44 '''
45 class D
46 class A1
47 '''

新式类与经典类的基础顺序

因为A新式类,对于继承A类都是新式类,首先要查找类E中是否有foo(),如果没有则按顺序查找C->D->A。它是一种广度优先查找方式。

因为A1经典类,对于继承A1类都是经典类,首先要查找类E1中是否有foo(),如果没有则按顺序查找C1->A1->D1。它是一种深度优先查找方式。

3、新式类增加了__slots__内置属性, 可以把实例属性的种类锁定到__slots__规定的范围之中。

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # Author: antcolonies
 4
 5 class A(object):
 6     __slots__ = ('name', 'age')
 7
 8 class A1:
 9     __slots__ = ('name', 'age')
10
11
12 a = A()
13 a1 = A1()
14
15 a.name1 = 'a'
16 a1.name1 = 'a1'
17
18 '''
19 Traceback (most recent call last):
20   File "E:/python14_workspace/s14/day06/py_1.py", line 15, in <module>
21     a.name1 = 'a'
22 AttributeError: 'A' object has no attribute 'name1'
23 '''

新式类增加属性锁定功能

A是新式类添加了__slots__ 属性,所以只允许添加 ‘name’ 和 ‘age’ 两种属性

A1经典类__slots__ 属性不起作用。

通常每一个实例都会有一个__dict__属性,用来记录实例中所有的属性和方法,也是通过这个字典,可以让实例绑定任意的属性;

而__slots__属性作用就是,当一个类C有比较少的变量,而且拥有__slots__属性时,类C的实例就没有__dict__属性,而是把变量的值存在一个固定的地方。如果试图访问一个__slots__中没有的属性,实例就会报错。这样操作有什么好处呢?__slots__属性虽然令实例失去了绑定任意属性的便利,但是因为每一个实例没有__dict__属性,却能有效节省每一个实例的内存消耗,有利于生成小而精干的实例。

 1 #-*- coding:utf-8 -*-
 2 #
 3
 4 class A(object):
 5     __slots__ = ('name', 'age')
 6
 7 class A1:
 8     __slots__ = ('name', 'age')
 9
10
11 a = A()
12 a1 = A1()
13
14 # a.name1 = 'a'
15 a1.name1 = 'a1'
16 a1.name = 'Tom'
17 a1.age = '23'
18 a.name = 'Tim'
19 a.age = '22'
20 print(a1.__dict__)
21 print(a.__slots__)
22 print(a.name, a.age)
23 print(a.__dict__)
24
25 '''
26 {'age': '23', 'name': 'Tom', 'name1': 'a1'}
27 ('name', 'age')
28 ('Tim', '22')
29 Traceback (most recent call last):
30   File "py_4.py", line 21, in <module>
31       print(a.__dict__)
32 AttributeError: 'A' object has no attribute '__dict__'
33 '''

新式类的__slots__特性

4、新式类增加了__getattribute__方法

 1 #-*- coding:utf-8 -*-
 2 #
 3
 4 class A(object):
 5     def __getattribute__(self, *args, **kwargs):
 6         print('A.__getattribute__')
 7
 8 class A1:
 9     def __getattribute__(self, *args, **kwargs):
10         print('A1.__getattribute__')
11
12
13 a = A()
14 a1 = A1()
15
16 a.test
17 print('============')
18 a1.test
19
20 '''
21 A.__getattribute__
22 ============
23 Traceback (most recent call last):
24   File "py_5.py", line 18, in <module>
25       a1.test
26 AttributeError: A1 instance has no attribute 'test'
27 '''

新式类__getattribute__()方法

可以看出A是新式类,每次通过实例访问属性,都会经过__getattribute__函数,A1不会调用__getattribute__所以出错了。

5、新式类相同父类只执行一次构造函数,经典类重复执行多次。

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # Author: antcolonies
 4
 5 class A:
 6     def __init__(self):
 7         print('a', end='')
 8
 9 class B(A):
10     def __init__(self):
11         A().__init__()
12         print('b', end='')
13
14 class C(A):
15     def __init__(self):
16         A().__init__()
17         print('c', end='')
18
19 class D(B, C):
20     def __init__(self):
21         B().__init__()
22         C().__init__()
23         print('d', end='')
24
25 class E(D, A):
26     def __init__(self):
27         D().__init__()
28         A().__init__()
29         print('e', end='')
30
31 d = D()
32 print('')
33 e = E()
34
35 '''
36 aabaabaacaacd
37 aabaabaacaacdaabaabaacaacdaae
38 '''

经典类构造函数重复执行

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # Author: antcolonies
 4
 5 class A(object):
 6     def __init__(self):
 7         print('a', end='')
 8
 9 class B(A):
10     def __init__(self):
11         super(B,self).__init__()
12         print('b', end='')
13
14 class C(A):
15     def __init__(self):
16         super(C, self).__init__()
17         print('c', end='')
18
19 class D(B, C):
20     def __init__(self):
21         super(D, self).__init__()
22         print('d', end='')
23
24 class E(D, A):
25     def __init__(self):
26         super(E, self).__init__()
27         print('e', end='')
28
29 d = D()
30 print('')
31 e = E()
32
33 '''
34 acbd
35 acbde
36 '''

新式类构造函数指执行一次即可

转载于:https://www.cnblogs.com/ant-colonies/p/6719724.html

新式类与经典类的比较相关推荐

  1. python中的__new__与__init__,新式类和经典类(2.x)

    在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A()) 新式类跟经典类的差别主要是以下几点: 1 ...

  2. 新式类和经典类的区别类的特殊方法单例模式

    目录: 新式类和经典类的区别 重写特殊的构造方法 类的特殊方法 单例模式原理及作用 新式类和经典类的区别: 1)首先,写法不一样: class A: #经典类写法passclass B(object) ...

  3. python中新式类和经典类

    python中的类分为新式类和经典类,具体有什么区别呢?简单的说, 1.新式类都从object继承,经典类不需要. Python 2.x中默认都是经典类,只有显式继承了object才是新式类 Pyth ...

  4. python新式类和经典类的区别?

    在python里凡是继承了object的类,都是新式类. Python2里面继承object的是新式类,没有写父类的是经典类. Python3里只有新式类. 经典类目前在Python里基本没有应用,多 ...

  5. Python 新式类与经典类

    新式类,经典类 查询匹配 广度查询 横着对每个类进行查询 深度查询 无视平级类,直接寻找下级类 #python 3.0 #新式类 广度查询 #经典类 广度查询 #python 2.0 #新式类 广度查 ...

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

    1. 版本支持 / 写法差异# 在Python 2.x 中 如果你至今使用的还是 Python 2.x,那么你需要了解一下,在Python 2.x中存在着两种类:经典类和新式类. 什么是经典类? Co ...

  7. python单例模式控制成只初始化一次,常规型的python单例模式在新式类和经典类中的区别。...

    单例模式的写法非常多,但常规型的单例模式就是这样写的,各种代码可能略有差异,但核心就是要搞清楚类属性 实例属性,就很容易写出来,原理完全一模一样. 如下: 源码: class A(object):de ...

  8. 面向对象【day07】:新式类和经典类(八)

    本节内容 1.概述 2.类的多继承 3.经典类VS新式类 4.总结 一.概述 在python还支持多继承,但是一般我们很少用,有些语言干脆就不支持多继承,有多继承,就会带来两个概念,经典类和新式类,下 ...

  9. 2021年了你还不了解新式类与经典类?

    "新式类" 与 "经典类" 我们所接触到的类,都是 "新式类"( new-style classes ).同时,在 Python 2.X 相 ...

  10. python3新式类_Python中新式类与经典类的区别详析

    1.新式类与经典类 在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于"新式类",都会获得所有"新式类"的 ...

最新文章

  1. 利用3D打印构建衍射深度神经网络,可光速执行数字运算
  2. 5 月书讯 | 程序员的历史课,是时候补补了
  3. Java并发编程基础与实战
  4. python3 open()内置函数
  5. hadoop配置项笔记 - hdfs
  6. .NET Core 2.0版本预计于2017年春季发布
  7. php多个请求只执行一次,php使用redis的blPop/brPop,一台服务器多个并发,也只能一次一次执行?...
  8. luogu P2680 运输计划 (二分答案+树上差分)
  9. Delphi 3D Glscene安装
  10. Linux之分析bin文件的10种方法
  11. 解决JDK下载速度过慢的问题
  12. 深度评测阿里云、腾讯云和华为云
  13. uniapp:使用百度API提取身份证信息(微信小程序适用)
  14. python web server 知乎_“知乎网”技术方案初探
  15. 辅助知识-第2 章 项目合同管理
  16. echarts 重新渲染数据
  17. SystemTap使用技巧【二】
  18. 利用 PRIMO 重构 M87 黑洞图像,普林斯顿高等研究院成功将「甜甜圈」变身「金戒指」
  19. 《Android游戏开发详解》——第3章,第3.6节图形
  20. nginx反向代理配置+lnmp优化+七层负载upstream+keepalived

热门文章

  1. 30 天精通 RxJS(29):30 天感言
  2. chromium的部署工具depot_tools和gclient
  3. 【网络文件共享】04、rsync基础
  4. Centos6.4系统局域网服务之DHCP
  5. SharePoint 2010新体验9 - 内容管理器(Content Organizer)
  6. C#中可以使用正则表达式来过滤html字符
  7. Nginx源码分析 - 基础数据结构篇 - 字符串结构 ngx_string.c(08)
  8. 使用cfssl生成证书时报json: cannot unmarshal object into Go value of type []csr.Name错误
  9. Java 8 新日期时间 API ( 上 ) – 本地日期时间
  10. 4.1线程组(Thread Group)