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元组及文件核心对象类型详解
Feb 11 Python
python 查找文件名包含指定字符串的方法
Jun 05 Python
django缓存配置的几种方法详解
Jul 16 Python
windows下python安装小白入门教程
Sep 18 Python
浅谈python函数调用返回两个或多个变量的方法
Jan 23 Python
详解python中list的使用
Mar 15 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
May 10 Python
Django多数据库的实现过程详解
Aug 01 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
Dec 04 Python
Python安装OpenCV的示例代码
Mar 05 Python
如何利用opencv判断两张图片是否相同详解
Jul 07 Python
Python利用zhdate模块实现农历日期处理
Mar 31 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
JavaScript 在线压缩和格式化收藏
2009/01/16 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
javascript中interval与setTimeOut的区别示例介绍
2014/03/14 Javascript
JS 实现列表与多选框选择附预览动画
2014/10/29 Javascript
JavaScript三元运算符的多种使用技巧
2015/04/16 Javascript
纯javascript代码实现计算器功能(三种方法)
2015/09/07 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
2015/09/24 Javascript
javascript中this关键字详解
2016/12/12 Javascript
原生js仿淘宝网商品放大镜效果
2017/02/28 Javascript
jQuery validate 验证radio实例
2017/03/01 Javascript
[js高手之路]寄生组合式继承的优势详解
2017/08/28 Javascript
JS中的Replace()传入函数时的用法详解
2017/09/11 Javascript
简单谈谈vue的过渡动画(推荐)
2017/10/11 Javascript
Vue.js实现双向数据绑定方法(表单自动赋值、表单自动取值)
2018/08/27 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
python字符串常用方法
2018/06/14 Python
python自动化UI工具发送QQ消息的实例
2019/08/27 Python
python socket 聊天室实例代码详解
2019/11/14 Python
Tensorflow中的dropout的使用方法
2020/03/13 Python
基于Django signals 信号作用及用法详解
2020/03/28 Python
django实现后台显示媒体文件
2020/04/07 Python
初学者学习Python好还是Java好
2020/05/26 Python
浅析python函数式编程
2020/09/26 Python
通信专业个人自我鉴定
2013/10/21 职场文书
大学军训感言
2014/01/10 职场文书
最新大学生创业计划书写作攻略
2014/04/02 职场文书
《登鹳雀楼》教学反思
2014/04/09 职场文书
《风筝》教学反思
2014/04/10 职场文书
奥巴马当选演讲稿
2014/09/10 职场文书
政风行风自查自纠报告
2014/10/21 职场文书
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
2021/06/29 Python
springboot用户数据修改的详细实现
2022/04/06 Java/Android
Hive HQL支持2种查询语句风格
2022/06/25 数据库