在Python中使用__slots__方法的详细教程


Posted in Python onApril 28, 2015

正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。先定义class:

>>> class Student(object):
...   pass
...

然后,尝试给实例绑定一个属性:

>>> s = Student()
>>> s.name = 'Michael' # 动态给实例绑定一个属性
>>> print s.name
Michael

还可以尝试给实例绑定一个方法:

>>> def set_age(self, age): # 定义一个函数作为实例方法
...   self.age = age
...
>>> from types import MethodType
>>> s.set_age = MethodType(set_age, s, Student) # 给实例绑定一个方法
>>> s.set_age(25) # 调用实例方法
>>> s.age # 测试结果
25

但是,给一个实例绑定的方法,对另一个实例是不起作用的:

>>> s2 = Student() # 创建新的实例
>>> s2.set_age(25) # 尝试调用方法
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'set_age'

为了给所有实例都绑定方法,可以给class绑定方法:

>>> def set_score(self, score):
...   self.score = score
...
>>> Student.set_score = MethodType(set_score, None, Student)

给class绑定方法后,所有实例均可调用:

>>> s.set_score(100)
>>> s.score
100
>>> s2.set_score(99)
>>> s2.score
99

通常情况下,上面的set_score方法可以直接定义在class中,但动态绑定允许我们在程序运行的过程中动态给class加上功能,这在静态语言中很难实现。
使用__slots__

但是,如果我们想要限制class的属性怎么办?比如,只允许对Student实例添加name和age属性。

为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class能添加的属性:

>>> class Student(object):
...   __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
...

然后,我们试试:

>>> s = Student() # 创建新的实例
>>> s.name = 'Michael' # 绑定属性'name'
>>> s.age = 25 # 绑定属性'age'
>>> s.score = 99 # 绑定属性'score'
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'

由于'score'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。

使用__slots__要注意,__slots__定义的属性仅对当前类起作用,对继承的子类是不起作用的:

>>> class GraduateStudent(Student):
...   pass
...
>>> g = GraduateStudent()
>>> g.score = 9999
Try

除非在子类中也定义__slots__,这样,子类允许定义的属性就是自身的__slots__加上父类的__slots__。

Python 相关文章推荐
Python Socket编程入门教程
Jul 11 Python
python安装与使用redis的方法
Apr 19 Python
从CentOS安装完成到生成词云python的实例
Dec 01 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
Jan 07 Python
使用pycharm设置控制台不换行的操作方法
Jan 19 Python
python selenium执行所有测试用例并生成报告的方法
Feb 13 Python
python实现整数的二进制循环移位
Mar 08 Python
python numpy实现文件存取的示例代码
May 26 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
Nov 20 Python
Pytorch中膨胀卷积的用法详解
Jan 07 Python
tensorflow 动态获取 BatchSzie 的大小实例
Jun 30 Python
详解Python 中的 defaultdict 数据类型
Feb 22 Python
Python实现扫描局域网活动ip(扫描在线电脑)
Apr 28 #Python
python将文本转换成图片输出的方法
Apr 28 #Python
Python psutil模块简单使用实例
Apr 28 #Python
Python RuntimeError: thread.__init__() not called解决方法
Apr 28 #Python
Python标准库defaultdict模块使用示例
Apr 28 #Python
Python自动重试HTTP连接装饰器
Apr 28 #Python
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
Apr 28 #Python
You might like
转换中文日期的PHP程序
2006/10/09 PHP
php操作excel文件 基于phpexcel
2010/07/02 PHP
PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
2012/02/05 PHP
PHP生成不同颜色、不同大小的tag标签函数
2013/09/23 PHP
php中出现空白页的原因及解决方法汇总
2014/07/08 PHP
PHP5.3新特性小结
2016/02/14 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
2017/04/27 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
javascript数组组合成字符串的脚本
2021/01/06 Javascript
JavaScript面向对象之体会[总结]
2008/11/13 Javascript
ASP 过滤数组重复数据函数(加强版)
2010/05/31 Javascript
jQuery1.5.1 animate方法源码阅读
2011/04/05 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
jQuery中children()方法用法实例
2015/01/07 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
jQuery的图片轮播插件PgwSlideshow使用详解
2016/08/11 Javascript
详解JS中遍历语法的比较
2017/04/07 Javascript
vue单页应用中如何使用jquery的方法示例
2017/07/27 jQuery
JavaScript面向对象精要(下部)
2017/09/12 Javascript
Javascript中将变量转换为字符串的三种方法
2017/09/19 Javascript
说说Vue.js中的functional函数化组件的使用
2019/02/12 Javascript
vue在路由中验证token是否存在的简单实现
2019/11/11 Javascript
Python中统计函数运行耗时的方法
2015/05/05 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
用Python3创建httpServer的简单方法
2018/06/04 Python
python用post访问restful服务接口的方法
2018/12/07 Python
selenium2.0中常用的python函数汇总
2019/08/05 Python
Python pandas 列转行操作详解(类似hive中explode方法)
2020/05/18 Python
python里反向传播算法详解
2020/11/22 Python
解决HTML5手机端页面缩放的问题
2017/10/27 HTML / CSS
Bealls Florida百货商店:生活服饰、家居装饰和鞋子
2018/02/23 全球购物
历史系毕业生自荐信
2013/10/28 职场文书
跟单文员的岗位职责
2013/11/14 职场文书
酒店保安员岗位职责
2014/01/31 职场文书
2014年世界艾滋病日演讲稿
2014/11/28 职场文书
上班迟到检讨书
2015/05/06 职场文书