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中条件判断语句的简单使用方法
Aug 21 Python
python中根据字符串调用函数的实现方法
Jun 12 Python
Python爬虫实战:分析《战狼2》豆瓣影评
Mar 26 Python
Python自定义装饰器原理与用法实例分析
Jul 16 Python
pycharm安装和首次使用教程
Aug 27 Python
python使用udp实现聊天器功能
Dec 10 Python
Python第三方库h5py_读取mat文件并显示值的方法
Feb 08 Python
PyCharm搭建Spark开发环境实现第一个pyspark程序
Jun 13 Python
深入浅析Python 中的sklearn模型选择
Oct 12 Python
Python底层封装实现方法详解
Jan 22 Python
Python 中数组和数字相乘时的注意事项说明
May 10 Python
解决numpy和torch数据类型转化的问题
May 23 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 zend 相对路径问题
2009/01/12 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
PHP文件读写操作相关函数总结
2014/11/18 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
php数组比较实现查找连续数的方法
2015/07/29 PHP
基于jquery的自定义鼠标提示效果 jquery.toolTip
2010/11/14 Javascript
JavaScript高级程序设计(第3版)学习笔记7 js函数(上)
2012/10/11 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
2013/11/28 Javascript
jQuery中对未来的元素绑定事件用bind、live or on
2014/04/17 Javascript
jQuery插件expander实现图片翻转特效
2015/05/21 Javascript
js实现获取当前时间是本月第几周的方法
2015/08/11 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
2015/08/24 Javascript
jquery实现表格隔行换色效果
2015/11/19 Javascript
JavaScript代码性能优化总结(推荐)
2016/05/16 Javascript
不使用script导入js文件的几种方法
2016/10/27 Javascript
15个顶级开源JavaScript框架和库
2018/10/10 Javascript
JavaScript实现简单计算器功能
2019/12/19 Javascript
JS实现网站吸顶条
2020/01/08 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
vue+iview使用树形控件的具体使用
2020/11/02 Javascript
微信小程序绘制半圆(弧形)进度条
2020/11/18 Javascript
[01:04:06]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第一局
2016/02/26 DOTA
Python3基础之基本运算符概述
2014/08/13 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
2020/07/28 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
把富文本的回车转为br标签
2019/08/09 HTML / CSS
html5 Canvas画图教程(1)—画图的基本常识
2013/01/09 HTML / CSS
幼儿园大班教学反思
2014/02/10 职场文书
单位婚育证明范本
2014/11/21 职场文书
大学生考试作弊被抓检讨书
2014/12/27 职场文书
检讨书大全
2015/01/27 职场文书
对外汉语教师推荐信
2015/03/27 职场文书
2016全国“质量月”活动标语口号
2015/12/26 职场文书
装修安全责任协议书
2016/03/22 职场文书
python爬取某网站原图作为壁纸
2021/06/02 Python
MySQL分区路径子分区再分区
2022/04/13 MySQL