细说python类2——类动态添加方法和slots(转)
先说一下类添加属性方法和实例添加属性和方法的区别,
类添加属性属于加了一个以类为全局的属性(据说叫静态属性),那么以后类的每一个实例化,都具有这个属性。给类加一个方法也如此,以后类的每一个实例化都具备这个方法(但是据说叫动态方法。)但是给实例加一个属性,作用域就是这个实例,是与类没关系的(据说这种属性叫动态属性)。
Python类的实例可以动态的添加属性。举个例子,声明一个类A
>>> class A(object):
... def __init__(self):
... print 'a'
实例化一个a,
a=A()
现在给a加一个name属性
>>> a.name='aaa'
>>> a.name
'aaa'
现在给A类加一个方法
>>> def func():
... print 'func'
>>> A.func=func
>>> a.func
<bound method A.func of <__main__.A object at 0x7f323dcb8750>>
>>> a.func()
func
那么slots可以做什么呢?slots可以防止给实例随意加一个属性。
>>> class A(object):
... def __init__(self):
... print 'func'
... __slots__=('name')
当我们修改name属性时,name被修改为aaa,
>>> a=A()
>>> a.name='aaa'
>>> a.name
'aaa'
但当我们想动态添加一个age属性时,报错了
>>> a.age=16
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'age'
但是当你想如下这样给类加一个属性的话,slots就不能限制了。
>>> A.age=3
这里要说一下,如果子类继承父类,父类里面有slots,这个slots是在子类里面不起作用的,如果想用,只能重写slots,达到想要的结果。