標籤:att last eth attribute stdin file 動態添加 一個 .net
先說一下類添加屬性方法和執行個體添加屬性和方法的區別,
類添加屬性屬於加了一個以類為全域的屬性(據說叫靜態屬性),那麼以後類的每一個執行個體化,都具有這個屬性。給類加一個方法也如此,以後類的每一個執行個體化都具備這個方法(但是據說叫動態方法。)但是給執行個體加一個屬性,範圍就是這個執行個體,是與類沒關係的(據說這種屬性叫動態屬性)。
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,達到想要的結果。
細說python類2——類動態添加方法和slots(轉)