在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操作数据库之sqlite3打开数据库、删除、修改示例
Mar 13 Python
详细讲解用Python发送SMTP邮件的教程
Apr 29 Python
详解python时间模块中的datetime模块
Jan 13 Python
Python获取指定文件夹下的文件名的方法
Feb 06 Python
python 文件查找及内容匹配方法
Oct 25 Python
Python补齐字符串长度的实例
Nov 15 Python
Django项目中添加ldap登陆认证功能的实现
Apr 04 Python
使用Python创建简单的HTTP服务器的方法步骤
Apr 26 Python
opencv导入头文件时报错#include的解决方法
Jul 31 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
Feb 05 Python
python实现FTP文件传输的方法(服务器端和客户端)
Mar 20 Python
python 5个实用的技巧
Sep 27 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
基于mysql的bbs设计(三)
2006/10/09 PHP
比较简单实用的PHP无限分类源码分享(思路不错)
2011/10/13 PHP
php分页思路以及在ZF中的使用
2012/05/30 PHP
php自定义apk安装包实例
2014/10/20 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
2019/10/22 PHP
基于jquery tab切换(防止页面刷新)
2012/05/23 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
2012/08/24 Javascript
Javascript基础教程之数组 array
2015/01/18 Javascript
javascript实现限制上传文件大小
2015/02/06 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
完美解决IE9浏览器出现的对象未定义问题
2016/09/29 Javascript
jQuery.datatables.js插件用法及api实例详解
2016/10/28 Javascript
微信小程序 欢迎界面开发的实例详解
2016/11/30 Javascript
微信小程序日历组件calendar详解及实例
2017/06/08 Javascript
jQuery操作DOM_动力节点Java学院整理
2017/07/04 jQuery
React Native如何消除启动时白屏的方法
2017/08/08 Javascript
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
2017/10/15 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
2020/11/12 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
用Python制作简单的钢琴程序的教程
2015/04/01 Python
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
批量将ppt转换为pdf的Python代码 只要27行!
2018/02/26 Python
对python3标准库httpclient的使用详解
2018/12/18 Python
django中ORM模型常用的字段的使用方法
2019/03/05 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
Myprotein芬兰官网:欧洲第一运动营养品牌
2019/05/05 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
大学生个人推荐信范文
2013/11/25 职场文书
2014年镇党建工作汇报材料
2014/11/02 职场文书
英语复习计划
2015/01/19 职场文书
医院保洁员岗位职责
2015/02/13 职场文书
windows server 2016 域环境搭建的方法步骤(图文)
2022/06/25 Servers