细说python类2——类动态添加方法和slots(转)

时间:2023-12-20 12:14:02

先说一下类添加属性方法和实例添加属性和方法的区别,

类添加属性属于加了一个以类为全局的属性(据说叫静态属性),那么以后类的每一个实例化,都具有这个属性。给类加一个方法也如此,以后类的每一个实例化都具备这个方法(但是据说叫动态方法。)但是给实例加一个属性,作用域就是这个实例,是与类没关系的(据说这种属性叫动态属性)。

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,达到想要的结果。