您的位置:首页 > 编程语言 > Python开发

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

2016-01-27 16:05 507 查看
先说一下类添加属性方法和实例添加属性和方法的区别,

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

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,达到想要的结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: