在Python中使用__slots__方法的详细教程


Posted in Python onApril 28, 2015

正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。先定义class:

>>> class Student(object):
...   pass
...

然后,尝试给实例绑定一个属性:

>>> s = Student()
>>> s.name = 'Michael' # 动态给实例绑定一个属性
>>> print s.name
Michael

还可以尝试给实例绑定一个方法:

>>> def set_age(self, age): # 定义一个函数作为实例方法
...   self.age = age
...
>>> from types import MethodType
>>> s.set_age = MethodType(set_age, s, Student) # 给实例绑定一个方法
>>> s.set_age(25) # 调用实例方法
>>> s.age # 测试结果
25

但是,给一个实例绑定的方法,对另一个实例是不起作用的:

>>> s2 = Student() # 创建新的实例
>>> s2.set_age(25) # 尝试调用方法
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'set_age'

为了给所有实例都绑定方法,可以给class绑定方法:

>>> def set_score(self, score):
...   self.score = score
...
>>> Student.set_score = MethodType(set_score, None, Student)

给class绑定方法后,所有实例均可调用:

>>> s.set_score(100)
>>> s.score
100
>>> s2.set_score(99)
>>> s2.score
99

通常情况下,上面的set_score方法可以直接定义在class中,但动态绑定允许我们在程序运行的过程中动态给class加上功能,这在静态语言中很难实现。
使用__slots__

但是,如果我们想要限制class的属性怎么办?比如,只允许对Student实例添加name和age属性。

为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class能添加的属性:

>>> class Student(object):
...   __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
...

然后,我们试试:

>>> s = Student() # 创建新的实例
>>> s.name = 'Michael' # 绑定属性'name'
>>> s.age = 25 # 绑定属性'age'
>>> s.score = 99 # 绑定属性'score'
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'

由于'score'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。

使用__slots__要注意,__slots__定义的属性仅对当前类起作用,对继承的子类是不起作用的:

>>> class GraduateStudent(Student):
...   pass
...
>>> g = GraduateStudent()
>>> g.score = 9999
Try

除非在子类中也定义__slots__,这样,子类允许定义的属性就是自身的__slots__加上父类的__slots__。

Python 相关文章推荐
王纯业的Python学习笔记 下载
Feb 10 Python
Python脚本判断 Linux 是否运行在虚拟机上
Apr 25 Python
详解Python的Django框架中的模版相关知识
Jul 15 Python
Python 迭代器与生成器实例详解
May 18 Python
python文本数据相似度的度量
Mar 12 Python
pandas获取groupby分组里最大值所在的行方法
Apr 20 Python
实例分析python3实现并发访问水平切分表
Sep 29 Python
python 读取Linux服务器上的文件方法
Dec 27 Python
Python使用matplotlib 画矩形的三种方式分析
Oct 31 Python
Python 复平面绘图实例
Nov 21 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
Mar 05 Python
什么是python的必选参数
Jun 21 Python
Python实现扫描局域网活动ip(扫描在线电脑)
Apr 28 #Python
python将文本转换成图片输出的方法
Apr 28 #Python
Python psutil模块简单使用实例
Apr 28 #Python
Python RuntimeError: thread.__init__() not called解决方法
Apr 28 #Python
Python标准库defaultdict模块使用示例
Apr 28 #Python
Python自动重试HTTP连接装饰器
Apr 28 #Python
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
Apr 28 #Python
You might like
十天学会php之第十天
2006/10/09 PHP
PHP使用SOAP扩展实现WebService的方法
2016/04/01 PHP
Thinkphp实现短信验证注册功能
2016/10/18 PHP
php微信公众号开发之快递查询
2018/10/20 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题
2007/01/09 Javascript
Javascript条件判断使用小技巧总结
2008/09/08 Javascript
JavaScript XML操作 封装类
2009/07/01 Javascript
另一个javascript小测验(代码集合)
2011/07/27 Javascript
JS模拟自动点击的简单实例
2013/08/08 Javascript
JS基于FileSystemObject创建一个指定路径的TXT文本文件
2015/08/05 Javascript
javascript设计简单的秒表计时器
2020/09/05 Javascript
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
JS实现保留n位小数的四舍五入问题示例
2016/08/03 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
React Native仿美团下拉菜单的实例代码
2017/08/08 Javascript
微信小程序tabBar用法实例详解
2017/12/04 Javascript
node中间层实现文件上传功能
2018/06/11 Javascript
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
layui 解决富文本框form表单提交为空的问题
2019/10/26 Javascript
举例讲解Python中的算数运算符的用法
2015/05/13 Python
Python编程之gui程序实现简单文件浏览器代码
2017/12/08 Python
使用sklearn之LabelEncoder将Label标准化的方法
2018/07/11 Python
快速解决jupyter启动卡死的问题
2020/04/10 Python
matplotlib实现数据实时刷新的示例代码
2021/01/05 Python
IE下实现类似CSS3 text-shadow文字阴影的几种方法
2011/05/11 HTML / CSS
美国女士时尚珠宝及配饰购物网站:Icing
2018/07/02 全球购物
大学四年职业生涯规划书范文
2014/01/02 职场文书
《蓝色的树叶》教学反思
2014/02/24 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
党的群众路线对照检查材料思想汇报(学校)
2014/10/04 职场文书
2015年民主生活会发言材料
2014/12/15 职场文书
2014年房地产个人工作总结
2014/12/20 职场文书
2015年质量管理工作总结范文
2015/05/18 职场文书
学生会宣传部竞选稿
2015/11/21 职场文书
小学生六年级作文之关于感恩
2019/08/16 职场文书
win10系统计算机图标怎么调出来?win10调出计算机图标的方法
2022/08/14 数码科技