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简单计算文件夹大小的方法
Jul 14 Python
python使用Pycharm创建一个Django项目
Mar 05 Python
python中的内置函数max()和min()及mas()函数的高级用法
Mar 29 Python
python docx 中文字体设置的操作方法
May 08 Python
使用Python制作自动推送微信消息提醒的备忘录功能
Sep 06 Python
python 随机打乱 图片和对应的标签方法
Dec 14 Python
Python面向对象程序设计类的封装与继承用法示例
Apr 12 Python
wxpython绘制圆角窗体
Nov 18 Python
python 遍历磁盘目录的三种方法
Apr 02 Python
OpenCV-Python实现轮廓的特征值
Jun 09 Python
python入门学习关于for else的特殊特性讲解
Nov 20 Python
Python实现视频中添加音频工具详解
Dec 06 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,ASP.JAVA,JAVA代码格式化工具整理
2010/06/15 PHP
php中关于普通表单多文件上传的处理方法
2011/03/25 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
2014/11/08 PHP
PHP代码优化技巧小结
2015/09/29 PHP
Laravel5.1 框架控制器基础用法实例分析
2020/01/04 PHP
jquery图片上下tab切换效果
2011/03/18 Javascript
JS正则中的RegExp对象对象
2012/11/07 Javascript
原生js实现图片轮播特效
2015/12/18 Javascript
探究Javascript模板引擎mustache.js使用方法
2016/01/26 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
XMLHttpRequest Level 2 使用指南
2016/08/26 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
树结构之JavaScript
2017/01/24 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
ES6新特性之解构、参数、模块和记号用法示例
2017/04/01 Javascript
vuex 动态注册方法 registerModule的实现
2019/07/03 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
vue中监听返回键问题
2019/08/28 Javascript
Python 的 Socket 编程
2015/03/24 Python
python读取文本中数据并转化为DataFrame的实例
2018/04/10 Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
2018/12/12 Python
python脚本开机自启的实现方法
2019/06/28 Python
python3获取url文件大小示例代码
2019/09/18 Python
python实现拉普拉斯特征图降维示例
2019/11/25 Python
如何在python中实现线性回归
2020/08/10 Python
京东国际站:JOYBUY
2017/11/23 全球购物
世界上最好的足球商店:Unisport
2019/03/02 全球购物
Bluebella德国官网:英国性感内衣和睡衣品牌
2019/11/08 全球购物
简历的个人自我评价范文
2014/01/03 职场文书
企业文化口号
2014/06/12 职场文书
2014年学校总务处工作总结
2014/12/08 职场文书
请客吃饭开场白
2015/06/01 职场文书
CSS3实现的水平标题菜单
2021/04/14 HTML / CSS
详解Vue项目的打包方式(生成dist文件)
2022/01/18 Vue.js
vue css 相对路径导入问题级踩坑记录
2022/06/05 Vue.js