在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和php通信乱码问题解决方法
Apr 15 Python
跟老齐学Python之关于类的初步认识
Oct 11 Python
快速实现基于Python的微信聊天机器人示例代码
Mar 03 Python
TensorFlow安装及jupyter notebook配置方法
Sep 08 Python
python XlsxWriter模块创建aexcel表格的实例讲解
May 03 Python
深入理解Django自定义信号(signals)
Oct 15 Python
python实现一组典型数据格式转换
Dec 15 Python
Python参数解析模块sys、getopt、argparse使用与对比分析
Apr 02 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
Jul 03 Python
Django 用户认证组件使用详解
Jul 23 Python
Python 字符串、列表、元组的截取与切片操作示例
Sep 17 Python
Python代码风格与编程习惯重要吗?
Jun 03 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实现的DES加密解密类定义与用法示例
2020/11/02 PHP
基于jQuery的树控件实现代码(asp.net+json)
2010/07/11 Javascript
setInterval与clearInterval的使用示例代码
2014/01/28 Javascript
JS实现图片无间断滚动代码汇总
2014/07/30 Javascript
jQuery实现的支持IE的html滑动条
2015/03/16 Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
2015/09/18 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
Vue中添加过渡效果的方法
2017/03/16 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
微信小程序使用navigateTo数据传递的实例
2017/09/26 Javascript
实例讲解Vue.js中router传参
2018/04/22 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
2018/09/18 Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
2019/01/03 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
小谈angular ng deploy的实现
2020/04/07 Javascript
wxPython框架类和面板类的使用实例
2014/09/28 Python
python文件的md5加密方法
2016/04/06 Python
python装饰器初探(推荐)
2016/07/21 Python
Python 3.x 连接数据库示例(pymysql 方式)
2017/01/19 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
2020/01/20 Python
Django修改app名称和数据表迁移方案实现
2020/09/17 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
教你使用Canvas处理图片的方法
2017/11/28 HTML / CSS
NBA欧洲商店(法国):NBA Europe Store FR
2016/10/19 全球购物
汉森冲浪板:Hansen Surfboards
2018/05/19 全球购物
来自圣地亚哥的实惠太阳镜:Knockaround
2018/08/27 全球购物
Java Servlet API中forward() 与redirect()的区别
2014/04/20 面试题
酒店前厅员工辞职信
2014/01/08 职场文书
国际经济与贸易专业大学生职业规划书
2014/03/01 职场文书
关于护士节的演讲稿
2014/05/26 职场文书
建设工程授权委托书
2014/09/22 职场文书
2014年会计主管工作总结
2014/12/20 职场文书
审美与表现自我评价
2015/03/09 职场文书
干货:如何写好工作总结报告!
2019/05/10 职场文书
创业计划书之旅游网站
2019/09/06 职场文书