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命令行参数解析模块optparse使用实例
Apr 13 Python
python实现备份目录的方法
Aug 03 Python
Python实现购物系统(示例讲解)
Sep 13 Python
学习Python3 Dlib19.7进行人脸面部识别
Jan 24 Python
windows环境下tensorflow安装过程详解
Mar 30 Python
简单实现Python爬取网络图片
Apr 01 Python
Python依赖包整体迁移方法详解
Aug 15 Python
Django实现文件上传下载
Oct 06 Python
python opencv将表格图片按照表格框线分割和识别
Oct 30 Python
django框架ModelForm组件用法详解
Dec 11 Python
Python使用循环神经网络解决文本分类问题的方法详解
Jan 16 Python
学习Python列表的基础知识汇总
Mar 10 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 按指定元素值去除数组元素的实现方法
2011/11/04 PHP
PHP实现的简易版图片相似度比较
2015/01/07 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
2016/01/07 PHP
PHP设计模式之迭代器模式
2016/06/17 PHP
Zend Framework基于Command命令行建立ZF项目的方法
2017/02/18 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
Javascript调试工具(下载)
2007/01/09 Javascript
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
js实现广告漂浮效果的小例子
2013/07/02 Javascript
js 获取input点选按钮的值的方法
2014/04/14 Javascript
jquery中each遍历对象和数组示例
2014/08/05 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
js实现格式化金额,字符,时间的方法
2015/02/26 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
在Docker快速部署Node.js应用的详细步骤
2016/09/02 Javascript
Bootstrap表单使用方法详解
2017/02/17 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
2017/03/13 Javascript
jQuery事件对象的属性和方法详解
2017/09/09 jQuery
JS实现标签滚动切换效果
2017/12/25 Javascript
记录一篇关于redux-saga的基本使用过程
2018/08/18 Javascript
Vue官方推荐AJAX组件axios.js使用方法详解与API
2018/10/09 Javascript
vue将单页面改造成多页面应用的方法
2018/11/25 Javascript
[01:19]2014DOTA2国际邀请赛 采访TITAN战队ohaiyo 能赢DK很幸运
2014/07/12 DOTA
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
详解Python 定时框架 Apscheduler原理及安装过程
2019/06/14 Python
html5适合移动应用开发的12大特性
2014/03/19 HTML / CSS
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
全球立体声:World Wide Stereo
2018/09/29 全球购物
数百万免费的图形资源:Freepik
2020/09/21 全球购物
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
公司营业员的自我评价
2014/03/04 职场文书
社区党务公开实施方案
2014/03/18 职场文书
家长学校工作方案
2014/05/07 职场文书
领导干部个人对照检查材料(群众路线)
2014/09/26 职场文书
优秀英文求职信范文
2015/03/19 职场文书