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中的面向对象编程详解(下)
Apr 13 Python
将Python代码嵌入C++程序进行编写的实例
Jul 31 Python
50行Python代码实现人脸检测功能
Jan 23 Python
Python聊天室程序(基础版)
Apr 01 Python
python实现下载pop3邮件保存到本地
Jun 19 Python
浅析python中numpy包中的argsort函数的使用
Aug 30 Python
使用Python操作FTP实现上传和下载的方法
Apr 01 Python
python 用户交互输入input的4种用法详解
Sep 24 Python
Pyspark读取parquet数据过程解析
Mar 27 Python
python中执行smtplib失败的处理方法
Jul 01 Python
Python实现FTP文件定时自动下载的步骤
Dec 19 Python
Django框架中视图的用法
Jun 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
星际争霸任务指南——神族
2020/03/04 星际争霸
PHP 时间转换Unix时间戳代码
2010/01/22 PHP
Windows下编译PHP5.4和xdebug全记录
2015/04/03 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
CI(CodeIgniter)框架实现图片上传的方法
2017/03/24 PHP
Javascript下的keyCode键码值表
2007/04/10 Javascript
jquery 跳到顶部和底部动画2句代码简单实现
2013/07/18 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
CSS3 3D 技术手把手教你玩转
2016/09/02 Javascript
angularjs实现多张图片上传并预览功能
2017/02/24 Javascript
JavaScript的继承实现小结
2017/05/07 Javascript
webpack-dev-server自动更新页面方法
2018/02/22 Javascript
Webpack打包字体font-awesome的方法示例
2018/04/26 Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
2018/07/10 Javascript
JavaScript对象访问器Getter及Setter原理解析
2020/12/08 Javascript
python开发之基于thread线程搜索本地文件的方法
2015/11/11 Python
Python时间模块datetime、time、calendar的使用方法
2016/01/13 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
2019/06/20 Python
使用Pandas对数据进行筛选和排序的实现
2019/07/29 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
python matplotlib折线图样式实现过程
2019/11/04 Python
Python 列表中的修改、添加和删除元素的实现
2020/06/11 Python
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
银河香水:Galaxy Perfume
2019/03/25 全球购物
服装机修工岗位职责
2013/12/26 职场文书
设备动力科岗位职责范本
2014/02/23 职场文书
交通工程专业推荐信
2014/09/06 职场文书
全国法院系统开展党的群众路线教育实践活动综述(全文)
2014/10/25 职场文书
租车协议书范本2014
2014/11/17 职场文书
西安事变观后感
2015/06/12 职场文书
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
spring项目中切面及AOP的使用方法
2021/06/26 Java/Android
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
2022/04/29 Servers
Vue router配置与使用分析讲解
2022/12/24 Vue.js