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的迭代器和生成器
Jul 29 Python
Python中str.format()详解
Mar 12 Python
python绘制双柱形图代码实例
Dec 14 Python
numpy排序与集合运算用法示例
Dec 15 Python
对python中dict和json的区别详解
Dec 18 Python
Python3 使用cookiejar管理cookie的方法
Dec 28 Python
Python设计模式之模板方法模式实例详解
Jan 17 Python
Python selenium根据class定位页面元素的方法
Feb 26 Python
python实现一个函数版的名片管理系统过程解析
Aug 27 Python
django的403/404/500错误自定义页面的配置方式
May 21 Python
Python celery原理及运行流程解析
Jun 13 Python
编写python程序的90条建议
Apr 14 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
php 获取SWF动画截图示例代码
2014/02/10 PHP
基于命令行执行带参数的php脚本并取得参数的方法
2016/01/25 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
JS实现的数组全排列输出算法
2015/03/19 Javascript
原创jQuery弹出层插件分享
2015/04/02 Javascript
Vue.js实战之利用vue-router实现跳转页面
2017/04/01 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
2017/05/05 Javascript
表格展示利器 Bootstrap Table实例代码
2017/09/06 Javascript
Vue组件中slot的用法
2018/01/30 Javascript
详解小程序循环require之坑
2019/03/08 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
2019/04/08 Javascript
在Layui中实现开关按钮的效果实例
2019/09/29 Javascript
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
python实现在无须过多援引的情况下创建字典的方法
2014/09/25 Python
python使用正则表达式提取网页URL的方法
2015/05/26 Python
Windows下实现Python2和Python3两个版共存的方法
2015/06/12 Python
5种Python单例模式的实现方式
2016/01/14 Python
Python无损音乐搜索引擎实现代码
2018/02/02 Python
python学生管理系统代码实现
2020/04/05 Python
Python将图片转换为字符画的方法
2020/06/16 Python
python  Django中的apps.py的目的是什么
2018/10/15 Python
详解python持久化文件读写
2019/04/06 Python
python实现树的深度优先遍历与广度优先遍历详解
2019/10/26 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
2019/11/11 Python
tensorflow实现残差网络方式(mnist数据集)
2020/05/26 Python
python 基于selectors库实现文件上传与下载
2020/12/31 Python
解决PDF 转图片时丢文字的一种可能方式
2021/03/04 Python
十岁生日父母答谢词
2014/01/18 职场文书
伊索寓言教学反思
2014/05/01 职场文书
优秀少先队辅导员先进事迹材料
2014/05/18 职场文书
优秀英文求职信范文
2015/03/19 职场文书
亲戚关系证明
2015/06/24 职场文书
2019职场单身人才调研报告:互联网行业单身比例最高
2019/08/07 职场文书
Vue接口封装的完整步骤记录
2021/05/14 Vue.js
安装配置mysql及Navicat prenium的详细流程
2021/06/10 MySQL
Python Flask搭建yolov3目标检测系统详解流程
2021/11/07 Python