python中的__slots__使用示例


Posted in Python onFebruary 26, 2015

正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。先定义class:

>>> class Staff(object):

...     pass

...

然后,尝试给实例绑定一个属性:
>>> s = Staff()

>>> s.name = 'jack'

>>> print s.name

jack

>>>

还可以尝试给实例绑定一个方法:

>>> def set_age(self,age):

...     self.age = age

... 

>>> from types import MethodType

>>> s.set_age = MethodType(set_age, s, Staff)

>>> s.set_age(34)

>>> s.age

34

但是,给一个实例绑定的方法,对另一个实例是不起作用的:

>>> s2 = Staff()

>>> s2.set_age(35)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'Staff' object has no attribute 'set_age'

为了给所有实例都绑定方法,可以给class绑定方法:

>>> def set_score(self, score):

...     self.score = score

... 

>>> Staff.set_score = MethodType(set_score, None, Staff)

给class绑定方法后,所有实例均可调用:
>>> s.set_score(100)

>>> s.score

100

>>> s2.set_score(99)

>>> s2.score

99

通常情况下,上面的set_score方法可以直接定义在class中,但动态绑定允许我们在程序运行的过程中动态给class加上功能,这在静态语言中很难实现。

使用__slots__

但是,如果我们想要限制class的属性怎么办?比如,只允许对Staff实例添加name和age属性。

为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class能添加的属性:

>>> class Staff(object):

...     __slots__ = ('name', 'age')

...

然后,我们试试:

>>> s = Staff()

>>> s.name = 'jack'

>>> s.age = 34

>>> s.score = 99

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'Staff' object has no attribute 'score'

由于‘sorce'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。

使用__slots__要注意,__slots__定义的属性仅对当前类起作用,对继承的子类是不起作用的:

>>> class GraduateStaff(Staff):

...     pass

... 

>>> g = GraduateStaff()

>>> g.score = 9999

>>> g.score

9999

除非在子类中也定义__slots__,这样,子类允许定义的属性就是自身的__slots__加上父类的__slots__。
Python 相关文章推荐
Python函数参数类型*、**的区别
Apr 11 Python
将Emacs打造成强大的Python代码编辑工具
Nov 20 Python
解决phantomjs截图失败,phantom.exit位置的问题
May 17 Python
python 文件转成16进制数组的实例
Jul 09 Python
Python 通过调用接口获取公交信息的实例
Dec 17 Python
Python简单获取二维数组行列数的方法示例
Dec 21 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
Mar 05 Python
Python操作rabbitMQ的示例代码
Mar 19 Python
Django密码系统实现过程详解
Jul 19 Python
Python实现语音识别和语音合成功能
Sep 20 Python
使用python实现下载我们想听的歌曲,速度超快
Jul 09 Python
python与idea的集成的实现
Nov 20 Python
Python map和reduce函数用法示例
Feb 26 #Python
Python中运行并行任务技巧
Feb 26 #Python
Python通过递归遍历出集合中所有元素的方法
Feb 25 #Python
Python THREADING模块中的JOIN()方法深入理解
Feb 18 #Python
python持久性管理pickle模块详细介绍
Feb 18 #Python
Python中暂存上传图片的方法
Feb 18 #Python
Python中AND、OR的一个使用小技巧
Feb 18 #Python
You might like
用Flash图形化数据(二)
2006/10/09 PHP
PHP文件注释标记及规范小结
2012/04/01 PHP
PHP生成指定随机字符串的简单实现方法
2015/04/01 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
PHP中Array相关函数简介
2016/07/03 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
2016/10/08 PHP
PHP简单实现冒泡排序的方法
2016/12/26 PHP
编辑浪子版表单验证类
2007/05/12 Javascript
JavaScript delete 属性的使用
2009/10/08 Javascript
jquery 事件对象属性小结
2010/04/27 Javascript
解析img图片没找到onerror事件 Stack overflow at line: 0
2013/12/23 Javascript
angularjs中的e2e测试实例
2014/12/06 Javascript
2则自己编写的jQuery特效分享
2015/02/26 Javascript
Bootstrap精简教程
2015/11/27 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
jQuery zTree加载树形菜单功能
2016/02/25 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
2016/04/01 Javascript
浅谈js中的三种继承方式及其优缺点
2016/08/10 Javascript
ES6中Symbol类型用法实例详解
2017/04/06 Javascript
在Vue中使用axios请求拦截的实现方法
2018/10/25 Javascript
解决ant Design Search无法输入内容的问题
2020/10/29 Javascript
[03:57]2016完美“圣”典风云人物:rOtk专访
2016/12/09 DOTA
对Python中实现两个数的值交换的集中方法详解
2019/01/11 Python
python机器学习库scikit-learn:SVR的基本应用
2019/06/26 Python
使用matlab或python将txt文件转为excel表格
2019/11/01 Python
浅谈matplotlib中FigureCanvasXAgg的用法
2020/06/16 Python
python接口自动化之ConfigParser配置文件的使用详解
2020/08/03 Python
Python eval函数原理及用法解析
2020/11/14 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
大学生求职计划书
2014/04/30 职场文书
教师党员自我剖析材料
2014/09/29 职场文书
2015年大学辅导员工作总结
2015/05/12 职场文书
教师病假条范文
2015/08/17 职场文书
pytest配置文件pytest.ini的详细使用
2021/04/17 Python
OpenCV-Python实现怀旧滤镜与连环画滤镜
2021/06/09 Python
redis 解决库存并发问题实现数量控制
2022/04/08 Redis