使用__slots__
2016-01-24 13:33
357 查看
正常情况下。当我们定义了一个class,创建了一个class的实例后,我们能够给该实例绑定不论什么属性和方法,这就是动态语言的灵活性。先定义class:
然后。尝试给实例绑定一个属性:
还能够尝试给实例绑定一个方法:
可是,给一个实例绑定的方法,对还有一个实例是不起作用的:
为了给全部实例都绑定方法,能够给class绑定方法:
给class绑定方法后。全部实例均可调用:
通常情况下。上面的
可是,假设我们想要限制class的属性怎么办?比方。仅仅同意对Student实例加入
为了达到限制的目的,Python同意在定义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
除非在子类中也定义
__slots__,这样,子类同意定义的属性就是自身的
__slots__加上父类的
__slots__。
相关文章推荐
- Hdu1241Oil Deposits
- VirtualBox主机与虚拟机不能复制粘贴的解决办法
- 对View绘制流程的一些理解
- jquery animate扩展
- 刷过一题之NOIP2013转圈游戏
- Data Binding的报错集合: 例如Error:(10, 54) 错误: 程序包com.kodulf.recyclerviewdatabinding.databinding不存在
- python序列通用操作符
- Java 进阶——单例模式
- CSS实现文字随屏幕变化
- ubuntu(linux)下source、sh/bash、./ 和 直接 执行脚本的区别
- BZOJ1077 天平
- 刷过一题之NOIP2013表达式求值
- 2015年第六届蓝桥杯C/C++程序设计本科B组省赛 九数组分数(代码填空)
- 告诉你自己一定要努力
- Android消息循环分析
- [总结]PHP字符串处理
- C++:泛型编程vector(成绩排序)
- Qualcomm Atheros Device [168c:0041] (rev 20) ubuntu wifi driver
- Android 5.1 以太网服务启动过程
- 刷过一题之NOIP2013花匠