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 10 Python
python实现的守护进程(Daemon)用法实例
Jun 02 Python
Python的Socket编程过程中实现UDP端口复用的实例分享
Mar 19 Python
Python并发编程协程(Coroutine)之Gevent详解
Dec 27 Python
解决python matplotlib imshow无法显示的问题
May 24 Python
Python使用sort和class实现的多级排序功能示例
Aug 15 Python
python判断输入日期为第几天的实例
Nov 13 Python
python如何解析配置文件并应用到项目中
Jun 27 Python
Python学习笔记之Django创建第一个数据库模型的方法
Aug 07 Python
Python实现滑动平均(Moving Average)的例子
Aug 24 Python
关于Python 常用获取元素 Driver 总结
Nov 24 Python
python turtle工具绘制四叶草的实例分享
Feb 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
WHOIS类的修改版
2006/10/09 PHP
PHP中str_replace函数使用小结
2008/10/11 PHP
约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
2010/10/12 PHP
通过缓存数据库结果提高PHP性能的原理介绍
2012/09/05 PHP
php生成随机数的三种方法
2014/09/10 PHP
ThinkPHP自动完成中使用函数与回调方法实例
2014/11/29 PHP
php实现简易聊天室应用代码
2015/09/23 PHP
关于Javascript 的 prototype问题。
2007/01/03 Javascript
jQuery Ajax 实例全解析
2011/04/20 Javascript
JavaScript通过RegExp实现客户端验证处理程序
2013/05/07 Javascript
jquery自定义滚动条插件示例分享
2014/02/21 Javascript
javascript二维数组转置实例
2015/01/22 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
2015/04/06 Javascript
jquery正则表达式验证(手机号、身份证号、中文名称)
2015/12/31 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
js 作用域和变量详解
2017/02/16 Javascript
微信小程序 http请求的session管理
2017/06/07 Javascript
Angular实现响应式表单
2017/08/04 Javascript
VUE实现一个分页组件的示例
2017/09/13 Javascript
动手写一个angular版本的Message组件的方法
2017/12/16 Javascript
基于vue.js组件实现分页效果
2018/12/29 Javascript
Python字符遍历的艺术
2008/09/06 Python
Python使用asyncio包处理并发详解
2017/09/09 Python
Python 反转字符串(reverse)的方法小结
2018/02/20 Python
Python Opencv实现图像轮廓识别功能
2020/03/23 Python
python查看文件大小和文件夹内容的方法
2019/07/08 Python
pandas 按日期范围筛选数据的实现
2021/02/20 Python
美国高端寝具品牌:Coyuchi
2017/02/08 全球购物
如何编写优秀的食品项目创业计划书
2014/01/23 职场文书
学习2014年全国两会心得体会
2014/03/12 职场文书
投标担保书范文
2014/04/02 职场文书
质量标语大全
2014/06/12 职场文书
《爱的教育》读书心得
2014/11/08 职场文书
鲁冰花观后感
2015/06/10 职场文书
iPhone13将有八大升级
2021/04/15 数码科技
SQL Server2019数据库之简单子查询的具有方法
2021/04/27 SQL Server