- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章浅谈python之新式类由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
本文中代码运行的python版本一律采取2.7.13 。
科普
经典类:classic class 。
新式类:new-style class 。
如何使用新式类 。
1
2
3
4
5
6
7
8
|
class
New(
object
):
# 显式继承object类
pass
class
Old:
pass
class
Old2():
pass
|
上述代码中的3种定义类的方法, 只有第一种方法定义的是新式类. 。
新式类VS经典类 。
新式类与经典类最主要的区别在于继承顺序, 事实上, 对于用户定义的每一个类, python 都会计算出一个方法解析顺序(Method Resolution Order, MRO)列表,它代表了类继承的顺序, 而由于经典类与新式类采用的算法不一致, 相同的继承关系可能会出现不一样的MRO列表. 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
import
inspect
class
D:
pass
class
C(D):
pass
class
B(D):
pass
class
A(B, C):
pass
print
inspect.getmro(A)
# (<class __main__.A at 0x000000000322BB88>,
# <class __main__.B at 0x000000000322B9A8>,
# <class __main__.D at 0x000000000322BC48>,
# <class __main__.C at 0x000000000322B948>)
class
D(
object
):
pass
class
C(D):
pass
class
B(D):
pass
class
A(B, C):
pass
print
inspect.getmro(A)
# (<class '__main__.A'>,
<
class
'__main__.B'
>,
<
class
'__main__.C'
>,
<
class
'__main__.D'
>,
<
type
'object'
>)
|
可以看到, 经典类的MRO顺序A-B-D-C 与新式类的MRO顺序 A-B-C-D-object 是存在差异的, 这可能会是我们日常会遇到的坑. 。
而除了继承顺序的差异, 新式类还添加了内置属性__slots__ 。
一般来说, 每个实例都有一个字典来管理实例的属性, 我们可以用__dict__ 来查看(__dict__并不保存类属性),它允许我们动态地修改实例的属性, 但是这也意味着每个实例都会有1个独立的字典需要我们去维护, 当我们需要创建大量的实例时, 这个操作是十分消耗内存的. 。
当我们在定义类时添加了__slots__属性后, 对象在实例化时就不会创建字典来管理实例属性, 而实例只能定义在__slots__里边已经设定好的属性名, 不允许动态添加其他未在__slots__里定义的属性 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class
Student(
object
):
__slots__
=
(
'id'
,
'name'
,
'gender'
)
def
exam(
self
):
pass
s1
=
Student()
'__dict__'
in
dir
(s1)
# False
s1.
id
=
10001
s1.
class
=
1
# AttributeError: 'Student' object has no attribute 'class'
def
func():
pass
s1.exam
=
func
# AttributeError: 'Student' object attribute 'f' is read-only
|
使用__slots__ 后我们不再能够动态地修改实例的属性, 那么使用__slots__究竟有什么好处呢?
优点: 1.节省内存 2.提高属性访问速度 。
缺点: 1.不能动态修改实例属性 。
当然, 除了继承顺序和__slots__, 新式类添加了__getattribute__方法, 还修改了实例的类型 。
1
2
3
4
5
6
7
8
9
10
11
12
|
class
New(
object
):
pass
class
Old:
pass
new
=
New()
old
=
Old()
print
(new)
# <__main__.New object at 0x0000000003262208>
print
(old)
# <__main__.Old instance at 0x000000000321C6C8>
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://www.cnblogs.com/dears/p/9138264.html 。
最后此篇关于浅谈python之新式类的文章就讲到这里了,如果你想了解更多关于浅谈python之新式类的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个扩展 celerys Task 的类。它在旧式 API 上运行得很好,但我在将它转换为新 API 时遇到问题。 # In app/tasks.py from celery import Cel
我刚刚更新到 scala meta 2.0.0-M1 和最新的 scala 2.12.3,现在宏不再编译。我所做的唯一更改是将元版本从 1.8.0 更改为 2.0.0-M1。 错误:新式(“内联”)宏
我是一名优秀的程序员,十分优秀!