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 相关文章推荐
10个易被忽视但应掌握的Python基本用法
Apr 01 Python
python中根据字符串调用函数的实现方法
Jun 12 Python
深入学习Python中的装饰器使用
Jun 20 Python
Python编写简单的HTML页面合并脚本
Jul 11 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
May 29 Python
详解python单元测试框架unittest
Jul 02 Python
python实现排序算法解析
Sep 08 Python
Django uwsgi Nginx 的生产环境部署详解
Feb 02 Python
Python3 无重复字符的最长子串的实现
Oct 08 Python
Python如何实现机器人聊天
Sep 10 Python
如何实现一个python函数装饰器(Decorator)
Oct 12 Python
python 实现一个图形界面的汇率计算器
Nov 09 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
用户的详细注册和判断
2006/10/09 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
PHP安装memcached扩展笔记
2015/05/28 PHP
Yii框架getter与setter方法功能与用法分析
2019/10/22 PHP
Js基础学习资料
2010/11/23 Javascript
jquery实现table鼠标经过变色代码
2013/09/25 Javascript
js获取通过ajax返回的map型的JSONArray的方法
2014/01/09 Javascript
JS获取各种宽度、高度的简单介绍
2014/12/19 Javascript
基于jQuery Ajax实现上传文件
2016/03/24 Javascript
基于jQuery插件实现点击小图显示大图效果
2016/05/11 Javascript
jQuery中用on绑定事件时需注意的事项
2017/03/19 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
2017/05/20 Javascript
解决vue 项目引入字体图标报错、不显示等问题
2018/09/01 Javascript
js取0-9随机取4个数不重复的数字代码实例
2019/03/27 Javascript
JS实现马赛克图片效果完整示例
2019/04/13 Javascript
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
Python中的is和==比较两个对象的两种方法
2017/09/06 Python
Python3实现从排序数组中删除重复项算法分析
2019/04/03 Python
OpenCV搞定腾讯滑块验证码的实现代码
2019/05/18 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
阿里云ECS服务器部署django的方法
2019/08/29 Python
基于Python实现大文件分割和命名脚本过程解析
2019/09/29 Python
Win下PyInstaller 安装和使用教程
2019/12/25 Python
详细分析Python collections工具库
2020/07/16 Python
Python实现简单的2048小游戏
2021/03/01 Python
Rockport乐步美国官网:风靡美国的白宫鞋
2016/11/24 全球购物
巴西在线鞋店:Shoestock
2017/10/28 全球购物
联想台湾官网:Lenovo TW
2018/05/09 全球购物
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
英国儿童设计师服装和玩具购物网站:Zac & Lulu
2020/10/19 全球购物
优秀语文教师事迹
2014/05/18 职场文书
医院合作协议书
2014/08/19 职场文书
2015年建筑工作总结报告
2015/05/04 职场文书
python爬虫框架feapde的使用简介
2021/04/20 Python
Python中tkinter的用户登录管理的实现
2021/04/22 Python
JavaScript canvas实现流星特效
2021/05/20 Javascript