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有证书的加密解密实现方法
Nov 19 Python
Python httplib模块使用实例
Apr 11 Python
编写Python爬虫抓取暴走漫画上gif图片的实例分享
Apr 20 Python
Python实现多态、协议和鸭子类型的代码详解
May 05 Python
python变量命名的7条建议
Jul 04 Python
Python 实现向word(docx)中输出
Feb 13 Python
将数据集制作成VOC数据集格式的实例
Feb 17 Python
pandas分组聚合详解
Apr 10 Python
对python中arange()和linspace()的区别说明
May 03 Python
10张动图学会python循环与递归问题
Feb 06 Python
python urllib库的使用详解
Apr 13 Python
Python Numpy之linspace用法说明
Apr 17 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部分常见问题总结
2006/10/09 PHP
javascript判断css3动画结束 css3动画结束的回调函数
2015/03/10 Javascript
jquery仿百度经验滑动切换浏览效果
2015/04/14 Javascript
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
JavaScript+html5 canvas制作色彩斑斓的正方形效果
2016/01/27 Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
2016/07/22 Javascript
详解React-Todos入门例子
2016/11/08 Javascript
Vue实现购物车功能
2017/04/27 Javascript
vue导航栏部分的动态渲染实例
2019/11/01 Javascript
python使用arp欺骗伪造网关的方法
2015/04/24 Python
Python 通过URL打开图片实例详解
2017/06/01 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
2017/07/06 Python
python利用标准库如何获取本地IP示例详解
2017/11/01 Python
python中matplotlib的颜色及线条控制的示例
2018/03/16 Python
python中退出多层循环的方法
2018/11/27 Python
解决Python3 被PHP程序调用执行返回乱码的问题
2019/02/16 Python
win8.1安装Python 2.7版环境图文详解
2019/07/01 Python
Python调用C语言的实现
2019/07/26 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
python中sklearn的pipeline模块实例详解
2020/05/21 Python
CSS3近阶段篇之酷炫的3D旋转透视
2016/04/28 HTML / CSS
英国排名第一的最新设计师品牌手表独立零售商:TIC Watches
2016/09/24 全球购物
欧洲领先的火车票和大巴票预订平台:Trainline
2018/12/26 全球购物
标记环介质访问控制协议
2016/03/27 面试题
Servlet的实例是在生命周期什么时候创建的?配置servlet最重要的是什么?
2012/05/30 面试题
高中自我鉴定
2013/12/20 职场文书
工程专业毕业生自荐信范文
2013/12/25 职场文书
《花的勇气》教后反思
2014/02/12 职场文书
会计核算科岗位职责
2014/03/19 职场文书
中华魂演讲稿
2014/05/13 职场文书
教师对照四风自我剖析材料
2014/09/30 职场文书
门市房租房协议书
2014/12/04 职场文书
小学安全工作总结2015
2015/05/18 职场文书
小学生读书笔记范文
2015/06/30 职场文书
2016年度继续教育学习心得体会
2016/01/19 职场文书
国际最新研究在陨石中发现DNA主要成分 或由陨石带来地球
2022/04/29 数码科技