在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 Requests 基础入门
Apr 07 Python
python django使用haystack:全文检索的框架(实例讲解)
Sep 27 Python
深入理解Python中range和xrange的区别
Nov 26 Python
浅谈Django REST Framework限速
Dec 12 Python
Python简单计算文件MD5值的方法示例
Apr 11 Python
Python实现统计给定字符串中重复模式最高子串功能示例
May 16 Python
python3 中文乱码与默认编码格式设定方法
Oct 31 Python
django的分页器Paginator 从django中导入类
Jul 25 Python
手把手教你pycharm专业版安装破解教程(linux版)
Sep 26 Python
基于python实现数组格式参数加密计算
Apr 21 Python
Python自动创建Excel并获取内容
Sep 16 Python
Python测试框架pytest高阶用法全面详解
Jun 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/12/21 PHP
一个PHP并发访问实例代码
2012/09/06 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
2015/04/14 PHP
PHP验证码生成原理和实现
2016/01/24 PHP
PHP simplexml_load_file()函数讲解
2019/02/03 PHP
javascript延时加载之defer测试
2012/12/28 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
jQuery实现根据类型自动显示和隐藏表单
2015/03/18 Javascript
javascript HTML+CSS实现经典橙色导航菜单
2016/02/16 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
2016/02/20 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
jQuery中可见性过滤器简单用法示例
2018/03/31 jQuery
JavaScript实现微信红包算法及问题解决方法
2018/04/26 Javascript
详解vue服务端渲染浏览器端缓存(keep-alive)
2018/10/12 Javascript
Python标准库os.path包、glob包使用实例
2014/11/25 Python
python分割列表(list)的方法示例
2017/05/07 Python
PyQt 线程类 QThread使用详解
2017/07/16 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
Python延时操作实现方法示例
2018/08/14 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
Python matplotlib学习笔记之坐标轴范围
2019/06/28 Python
Python3 执行Linux Bash命令的方法
2019/07/12 Python
python pandas获取csv指定行 列的操作方法
2019/07/12 Python
Django forms表单 select下拉框的传值实例
2019/07/19 Python
Python内置方法实现字符串的秘钥加解密(推荐)
2019/12/09 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
如何利用python发送邮件
2020/09/26 Python
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
2013/07/06 面试题
医务人员自我评价
2014/01/26 职场文书
宣传工作经验材料
2014/06/02 职场文书
护理学院专科毕业生求职信
2014/06/28 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
预防职务犯罪警示教育心得体会
2016/01/15 职场文书
nginx配置限速限流基于内置模块
2022/05/02 Servers