在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编写生成验证码的脚本的教程
May 04 Python
Python判断列表是否已排序的各种方法及其性能分析
Jun 20 Python
Python 12306抢火车票脚本
Feb 07 Python
python获取文件路径、文件名、后缀名的实例
Apr 23 Python
Python之lambda匿名函数及map和filter的用法
Mar 05 Python
Apache部署Django项目图文详解
Jul 30 Python
pytorch使用tensorboardX进行loss可视化实例
Feb 24 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
Mar 30 Python
Python如何使用正则表达式爬取京东商品信息
Jun 01 Python
Python xlrd模块导入过程及常用操作
Jun 10 Python
python随机打印成绩排名表
Jun 23 Python
python基础之类方法和静态方法
Oct 24 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
PL-880隐藏功能
2021/03/01 无线电
php使用curl访问https示例分享
2014/01/17 PHP
PHP 正则表达式常用函数
2014/08/17 PHP
php设计模式之单例模式实例分析
2015/02/25 PHP
yii2分页之实现跳转到具体某页的实例代码
2016/06/02 PHP
PHP7内核CGI与FastCGI详解
2019/04/14 PHP
CSS常用网站布局实例
2008/04/03 Javascript
jQuery链式操作如何实现以及为什么要用链式操作
2013/01/17 Javascript
js判断选择时间不能小于当前时间的示例代码
2013/09/24 Javascript
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
2013/11/20 Javascript
关于jQuery中的each方法(jQuery到底干了什么)
2014/03/05 Javascript
javascript实现在下拉列表中显示多级树形菜单的方法
2015/08/12 Javascript
AngularJS轻松实现双击排序的功能
2016/08/30 Javascript
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
2017/12/24 jQuery
AjaxUpLoad.js实现文件上传
2018/03/05 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
JavaScript实现文件下载并重命名代码实例
2019/12/12 Javascript
[57:38]2018DOTA2亚洲邀请赛3月30日 小组赛A组 OpTic VS OG
2018/03/31 DOTA
django 2.0更新的10条注意事项总结
2018/01/05 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
2018/03/19 Python
不管你的Python报什么错,用这个模块就能正常运行
2018/09/14 Python
python 判断参数为Nonetype类型或空的实例
2018/10/30 Python
详解django2中关于时间处理策略
2019/03/06 Python
Python中将两个或多个list合成一个list的方法小结
2019/05/12 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
python实现小程序推送页面收录脚本
2020/04/20 Python
Python的控制结构之For、While、If循环问题
2020/06/30 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
基于OpenCV的路面质量检测的实现
2020/11/04 Python
python爬虫 requests-html的使用
2020/11/30 Python
澳大利亚排名第一的儿童在线玩具商店:Toy Galaxy
2018/10/06 全球购物
廉政文化进校园广播稿
2014/10/20 职场文书
教师考核评语大全
2014/12/31 职场文书
2015教师节师德演讲稿
2015/03/19 职场文书
MySQL数据库Innodb 引擎实现mvcc锁
2022/05/06 MySQL
MySQL添加索引特点及优化问题
2022/07/23 MySQL