粘性問題在這裏一個Python初學者是abc
是一個類變量(即「靜態」變量),當你這樣做c1.abc = 3
,你影線的一個實例變量類變量。當你這樣做del c1.abc
del
適用於實例變量,所以現在調用c1.abc
返回類變量。
以下交互式會話應該清楚一些事情:
>>> class C:
... abc = 2
...
>>> c1 = C()
>>> c2 = C()
>>> c1.abc = 3
>>> c1.abc
3
>>> c2.abc
2
>>> C.abC# class "static" variable
2
>>> del c1.abc
>>> c1.abc
2
>>> c2.abc
2
>>> C.abc
2
>>> del c2.abc
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: C instance has no attribute 'abc'
>>> del C.abc
>>> c1.abc
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: C instance has no attribute 'abc'
>>>
這是del.<someattribute>
總是刪除實例屬性。如果應用於實例,它不會刪除類級屬性,而必須將其應用於類!
在Python中,所有寫在類塊中的東西都是,總是在類級別。從這個意義上講,它比Java更簡單。要定義一個實例變量,需要直接指定給實例,使用方法(c1.abc = 3
)或方法內部,使用傳遞給該方法的第一個參數(通過約定,這稱爲self
,但如果您想要,可以是 ):
>>> class C:
... def some_method(banana, x): # by convention you should use `self` instead of `banana`
... banana.x = x
...
>>> c = C()
>>> c.x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: C instance has no attribute 'x'
>>> c.some_method(5)
>>> c.x
5
@Aaron我不明白這與我的問題有甚麼關係。你能詳細說明嗎? – user6189
這裏給Python初學者的一個棘手問題是'abc'是一個*類變量*(即一個「靜態」變量),當你做'c1.abc = 3'時,你*實例變量。當你做'del c1.abc'時,'del'適用於* instance *變量,因此現在調用'c1.abc'返回類變量。 –
@Aaron但這不是這裏發生的事情。 –