在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使用cookie库操保存cookie详解
Mar 03 Python
python3写爬取B站视频弹幕功能
Dec 22 Python
Python学习笔记之While循环用法分析
Aug 14 Python
win10环境下配置vscode python开发环境的教程详解
Oct 16 Python
pygame实现打字游戏
Feb 19 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
Jan 20 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
Mar 30 Python
python实现飞船大战
Apr 24 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
Apr 29 Python
python的reverse函数翻转结果为None的问题
May 11 Python
解决Python 写文件报错TypeError的问题
Oct 23 Python
python实现模拟器爬取抖音评论数据的示例代码
Jan 06 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
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
php中count获取多维数组长度的方法
2014/11/03 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
JavaScript高级程序设计 阅读笔记(十二) js内置对象Math
2012/08/14 Javascript
AngularJS的内置过滤器详解
2015/05/14 Javascript
在JavaScript应用中实现延迟加载的方法
2015/06/25 Javascript
谈谈encodeURI和encodeURIComponent以及escape的区别与应用
2015/11/24 Javascript
javascript瀑布流布局实现方法详解
2016/02/17 Javascript
JavaScript函数柯里化详解
2016/04/29 Javascript
从零学习node.js之简易的网络爬虫(四)
2017/02/22 Javascript
jQuery简单绑定单个事件的方法示例
2017/06/10 jQuery
vue2.0 如何在hash模式下实现微信分享
2019/01/22 Javascript
layui实现数据分页功能(ajax异步)
2019/07/27 Javascript
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
Python编写屏幕截图程序方法
2015/02/18 Python
在Linux中通过Python脚本访问mdb数据库的方法
2015/05/06 Python
解决Python 使用h5py加载文件,看不到keys()的问题
2019/02/08 Python
python 弹窗提示警告框MessageBox的实例
2019/06/18 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
Python logging模块异步线程写日志实现过程解析
2020/06/30 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
2020/09/23 Python
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
解决HTML5手机端页面缩放的问题
2017/10/27 HTML / CSS
canvas 阴影和图形变换的示例代码
2018/01/02 HTML / CSS
AmazeUI 缩略图的实现示例
2020/08/18 HTML / CSS
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
专业幼师实习生自我鉴定范文
2013/12/08 职场文书
五年级学生评语
2014/04/22 职场文书
工厂门卫的岗位职责
2014/07/27 职场文书
天猫活动策划方案
2014/08/21 职场文书
关于工作经历的证明书
2014/10/11 职场文书
学历证明范文
2015/06/16 职场文书
《分数的意义》教学反思
2016/02/20 职场文书
Python3 使用pip安装git并获取Yahoo金融数据的操作
2021/04/08 Python
Spring 使用注解开发
2022/05/20 Java/Android
win10双系统怎么删除一个系统?win10电脑有两个系统删除一个的操作方法
2022/07/15 数码科技