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 相关文章推荐
使用PDB简单调试Python程序简明指南
Apr 25 Python
python中list列表的高级函数
May 17 Python
python中的随机函数random的用法示例
Jan 27 Python
基于Python中numpy数组的合并实例讲解
Apr 04 Python
对Python 文件夹遍历和文件查找的实例讲解
Apr 26 Python
在python中安装basemap的教程
Sep 20 Python
python3.5安装python3-tk详解
Apr 26 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
Jan 06 Python
Python3 字典dictionary入门基础附实例
Feb 10 Python
django-crontab实现服务端的定时任务的示例代码
Feb 17 Python
python将音频进行变速的操作方法
Apr 08 Python
基于Keras的格式化输出Loss实现方式
Jun 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图片库imagemagick安装方法
2014/09/23 PHP
php array_values 返回数组的值实例详解
2016/11/17 PHP
PHP面向对象程序设计之类与反射API详解
2016/12/02 PHP
php中遍历二维数组并以表格的形式输出的方法
2017/01/03 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
2019/02/28 PHP
wordpress自定义标签云与随机获取标签的方法详解
2019/03/22 PHP
javascript 页面划词搜索JS
2009/09/28 Javascript
jquery根据锚点offset值实现动画切换
2014/09/11 Javascript
Javascript HTML5 Canvas实现的一个画板
2020/04/12 Javascript
jQuery向webApi提交post json数据
2017/01/16 Javascript
Vue 2.0在IE11中打开项目页面空白的问题解决
2017/07/16 Javascript
在 webpack 中使用 ECharts的实例详解
2018/02/05 Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
2018/09/25 Javascript
详解微信小程序-canvas绘制文字实现自动换行
2019/04/26 Javascript
vue路由跳转传参数的方法
2019/05/06 Javascript
微信小程序文章详情页跳转案例详解
2019/07/09 Javascript
[08:40]Navi Vs Newbee
2018/06/07 DOTA
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python使用append合并两个数组的方法
2015/04/28 Python
用Python实现一个简单的能够上传下载的HTTP服务器
2015/05/05 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
Python获取指定字符前面的所有字符方法
2018/05/02 Python
python生成密码字典的方法
2018/07/06 Python
基于python实现语音录入识别代码实例
2020/01/17 Python
详解Python修复遥感影像条带的两种方式
2020/02/23 Python
使用Pycharm分段执行代码
2020/04/15 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
2020/12/08 Python
酒店营销策划方案
2014/02/07 职场文书
理工类毕业自我鉴定
2014/02/20 职场文书
材料会计岗位职责
2014/03/06 职场文书
银行职员自我鉴定
2014/04/20 职场文书
巾帼志愿者活动方案
2014/08/17 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
2017春节晚会开幕词
2016/03/03 职场文书
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
2021/09/25 Java/Android
css实现左上角飘带效果的完整代码
2022/03/18 HTML / CSS