在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 相关文章推荐
Centos5.x下升级python到python2.7版本教程
Feb 14 Python
Python解析excel文件存入sqlite数据库的方法
Nov 15 Python
python编程实现随机生成多个椭圆实例代码
Jan 03 Python
基于python实现名片管理系统
Nov 30 Python
浅谈python中真正关闭socket的方法
Dec 18 Python
对python 多个分隔符split 的实例详解
Dec 20 Python
Python提取PDF内容的方法(文本、图像、线条等)
Sep 25 Python
python 创建一维的0向量实例
Dec 02 Python
Python Tkinter Entry和Text的添加与使用详解
Mar 04 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
Jun 02 Python
解决Keras中CNN输入维度报错问题
Jun 29 Python
python代码实现扫码关注公众号登录的实战
Nov 01 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采用XML-RPC构造Web Service实例教程
2014/07/16 PHP
php中smarty区域循环的方法
2015/06/11 PHP
php 生成Tab键或逗号分隔的CSV
2016/09/24 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
jquery星级插件、支持页面中多次使用
2012/03/25 Javascript
jquery选择器大全 全面详解jquery选择器
2014/03/06 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
jquery动态增加删减表格行特效
2015/11/20 Javascript
javascript针对不确定函数的执行方法
2015/12/16 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
JavaScript计算器网页版实现代码分享
2016/07/15 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
jquery插件ContextMenu设置右键菜单
2017/03/13 Javascript
vue2.0s中eventBus实现兄弟组件通信的示例代码
2017/10/25 Javascript
JavaScript原型对象、构造函数和实例对象功能与用法详解
2018/08/04 Javascript
vue 音乐App QQ音乐搜索列表最新接口跨域设置方法
2018/09/25 Javascript
JavaScript箭头函数中的this详解
2019/06/19 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
vue内置组件component--通过is属性动态渲染组件操作
2020/07/28 Javascript
浅谈Python单向链表的实现
2015/12/24 Python
pyqt5简介及安装方法介绍
2018/01/31 Python
Python自定义线程类简单示例
2018/03/23 Python
python cumsum函数的具体使用
2019/07/29 Python
PyTorch里面的torch.nn.Parameter()详解
2020/01/03 Python
爱他美官方海外旗舰店:Aptamil奶粉
2017/12/22 全球购物
英国豪华真皮和布艺沙发销售网站:Darlings of Chelsea
2018/01/05 全球购物
幼儿园门卫岗位职责
2014/02/14 职场文书
社区清明节活动总结
2014/07/04 职场文书
预备党员2014年第四季度思想汇报范文
2014/10/25 职场文书
消防演习感想
2015/08/10 职场文书
Nginx使用X-Accel-Redirect实现静态文件下载的统计、鉴权、防盗链、限速等
2021/04/04 Servers
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
2021/06/11 Python
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL
java代码实现空间切割
2022/01/18 Java/Android
PYTHON InceptionV3模型的复现详解
2022/05/06 Python