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中实现从目录中过滤出指定文件类型的文件
Feb 02 Python
Python实现栈的方法
May 26 Python
用Python写一段用户登录的程序代码
Apr 22 Python
用Python写脚本,实现完全备份和增量备份的示例
Apr 29 Python
python3.x实现发送邮件功能
May 22 Python
Tensorflow使用tfrecord输入数据格式
Jun 19 Python
使用selenium模拟登录解决滑块验证问题的实现
May 10 Python
Python3匿名函数lambda介绍与使用示例
May 18 Python
set在python里的含义和用法
Jun 24 Python
Python如何实现小程序 无限求和平均
Feb 18 Python
如何使用Python自动生成报表并以邮件发送
Oct 15 Python
详解pandas赋值失败问题解决
Nov 29 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
第五节--克隆
2006/11/16 PHP
PHP中的strtr函数使用介绍(str_replace)
2011/10/20 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
PHP+MySql实现一个简单的留言板
2020/07/19 PHP
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
JS获取select-option-text_value的方法
2013/12/26 Javascript
jquery 字符串切割函数substring的用法说明
2014/02/11 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
js实现加载页面就自动触发超链接的示例
2017/08/31 Javascript
JS实现中文汉字按拼音排序的方法
2017/10/09 Javascript
layui从数据库中获取复选框的值并默认选中方法
2018/08/15 Javascript
小程序的上传文件接口的注意要点解析
2019/09/17 Javascript
BootstrapValidator验证用户名已存在(ajax)
2019/11/08 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
Python 判断奇数偶数的方法
2018/12/20 Python
python中while和for的区别总结
2019/06/28 Python
python openvc 裁剪、剪切图片 提取图片的行和列
2019/09/19 Python
python模拟实现斗地主发牌
2020/01/07 Python
python logging.basicConfig不生效的原因及解决
2020/02/20 Python
PyTorch中clone()、detach()及相关扩展详解
2020/12/09 Python
Koral官方网站:女性时尚运动服
2019/04/10 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
大学生家政服务项目创业计划书
2014/01/30 职场文书
超市活动计划书
2014/04/24 职场文书
2016学习雷锋精神活动倡议书
2015/04/27 职场文书
超市食品安全承诺书
2015/04/29 职场文书
入学证明
2015/06/23 职场文书
医院感染管理制度
2015/08/05 职场文书
2019年XX公司的晨会制度及流程!
2019/07/23 职场文书
JavaScript+HTML实现学生信息管理系统
2021/04/20 Javascript
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python
我去timi了,一起去timi是什么意思?
2022/04/13 杂记