在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的MongoDB模块PyMongo操作方法集锦
Jan 05 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
Jul 02 Python
安装Pycharm2019以及配置anconda教程的方法步骤
Nov 11 Python
Python qrcode 生成一个二维码的实例详解
Feb 12 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
Mar 04 Python
python使用pymongo与MongoDB基本交互操作示例
Apr 09 Python
Python importlib动态导入模块实现代码
Apr 16 Python
浅谈keras.callbacks设置模型保存策略
Jun 18 Python
python的flask框架难学吗
Jul 31 Python
Django跨域请求原理及实现代码
Nov 14 Python
python - timeit 时间模块
Apr 06 Python
使用python如何删除同一文件夹下相似的图片
May 07 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自定义函数收代码
2010/08/01 PHP
php curl选项列表(超详细)
2013/07/01 PHP
php使用Jpgraph创建折线图效果示例
2017/02/15 PHP
Yii框架安装简明教程
2020/05/15 PHP
jQuery 自动增长的文本输入框实现代码
2010/04/02 Javascript
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
node.js中的fs.createReadStream方法使用说明
2014/12/17 Javascript
javascript动态创建及删除元素的方法
2014/12/22 Javascript
Nodejs学习笔记之Stream模块
2015/01/13 NodeJs
jquery实现右键菜单插件
2015/03/29 Javascript
jquery实现倒计时功能
2015/12/28 Javascript
Javascript必知必会(四)js类型转换
2016/06/08 Javascript
浅析javascript中的Event事件
2016/12/09 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
浅谈webpack对样式的处理
2018/01/05 Javascript
NodeJS实现不可逆加密与密码密文保存的方法
2018/03/16 NodeJs
Angular-UI Bootstrap组件实现警报功能
2018/07/16 Javascript
Vue cli构建及项目打包以及出现的问题解决
2018/08/27 Javascript
node中的session的具体使用
2018/09/14 Javascript
js实现弹幕墙效果
2020/12/10 Javascript
Node.js 中如何收集和解析命令行参数
2021/01/08 Javascript
python list语法学习(带例子)
2013/11/01 Python
Python实现端口复用实例代码
2014/07/03 Python
Python读写txt文本文件的操作方法全解析
2016/06/26 Python
使用requests库制作Python爬虫
2018/03/25 Python
Python创建普通菜单示例【基于win32ui模块】
2018/05/09 Python
django框架两个使用模板实例
2019/12/11 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
2020/01/25 Python
PyQt5 控件字体样式等设置的实现
2020/05/13 Python
美国知名玩具品牌:Melissa & Doug
2016/08/16 全球购物
最新的小工具和卓越的产品设计:Oh That Tech!
2019/08/07 全球购物
澳洲Chemist Direct药房中文网:澳洲大型线上直邮药房
2019/11/04 全球购物
中东最大的在线宠物店:Dubai Pet Food
2020/06/11 全球购物
家佳咖啡店创业计划书
2013/12/27 职场文书
爷爷追悼会答谢词
2014/01/24 职场文书
Python深度学习之Pytorch初步使用
2021/05/20 Python