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升级提示Tkinter模块找不到的解决方法
Aug 22 Python
详细讲解Python中的文件I/O操作
May 24 Python
在Django中使用Sitemap的方法讲解
Jul 22 Python
python 设置文件编码格式的实现方法
Dec 21 Python
Python中垃圾回收和del语句详解
Nov 15 Python
Python学习笔记之视频人脸检测识别实例教程
Mar 06 Python
python制作抖音代码舞
Apr 07 Python
python实现通过队列完成进程间的多任务功能示例
Oct 28 Python
python 连续不等式语法糖实例
Apr 15 Python
python实现npy格式文件转换为txt文件操作
Jul 01 Python
python从ftp获取文件并下载到本地
Dec 05 Python
Python使用socket去实现TCP客户端和TCP服务端
Apr 12 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输出时间差函数代码
2013/01/28 PHP
使用PHP生成二维码的方法汇总
2015/07/22 PHP
php实现图片上传并利用ImageMagick生成缩略图
2016/03/14 PHP
PHP函数import_request_variables()用法分析
2016/04/02 PHP
PHP的消息通信机制测试实例
2016/11/10 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
JavaScript自执行闭包的小例子
2013/06/29 Javascript
JS获取select的value和text值的简单实例
2014/02/26 Javascript
javascript的动态加载、缓存、更新以及复用(一)
2014/06/09 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
2015/05/25 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
2015/06/24 Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
2015/11/17 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
2016/05/21 Javascript
原生JS实现在线问卷调查投票特效
2017/01/03 Javascript
Bootstrap的Carousel配合dropload.js实现移动端滑动切换图片
2017/03/10 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
vue任意关系组件通信与跨组件监听状态vue-communication
2020/10/18 Javascript
js实现随机圆与矩形功能
2020/10/29 Javascript
Python 变量类型及命名规则介绍
2013/06/08 Python
对pandas中apply函数的用法详解
2018/04/10 Python
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
2019/06/26 Python
Python tkinter和exe打包的方法
2020/02/05 Python
Python @property原理解析和用法实例
2020/02/11 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
澳大利亚UGG工厂直销:Australian Ugg Boots
2017/10/14 全球购物
澳大利亚手袋、珠宝和在线时尚精品店:The Way
2019/12/21 全球购物
基层党建工作汇报材料
2014/08/15 职场文书
县政府办公室领导班子个人对照检查材料
2014/09/16 职场文书
2015年调度员工作总结
2015/04/30 职场文书
资金申请报告范文
2015/05/14 职场文书
迎国庆主题班会
2015/08/17 职场文书