它有助於記住Python中的class
語句與其他語句比C++語言更接近任何其他語句。
在Python中,class
語句包含一堆要執行的語句,就像def
,if
或while
。不同之處在於譯員對這個區塊做了什麼。在流程控制塊語句(如if
和while
)的情況下,解釋器根據流控制語句的含義指定執行塊。在def
中,解釋程序保存塊並在調用函數對象時執行它。
在class
塊的情況下,Python的執行塊立即,在一個新的範圍,然後使用無論是在該範圍內執行左完成作爲類的內容之後。
因此,對於這個:
class testa():
a = []
Python的執行塊a = []
。然後在最後,範圍包含綁定到空列表對象的a
。所以這就是你的類。沒有任何特定的類的實例,那就是類本身。
它從object
繼承了一個無所作爲的構造函數,因此當您用ta1 = testa()
實例化類時,會得到一個空實例。然後,當您詢問ta1.a
時,Python找不到名爲a
的實例變量(因爲ta1
根本沒有實例變量),所以它在testa
類中查找a
。這當然會發現;但對於testa
的每個實例它都會找到相同的結果,因此您可以看到您觀察到的行爲。
在另一方面這樣的:
class testb():
def __init__(self):
self.a = []
是完全不同的。這裏一旦類塊被執行,類作用域的內容又是一個單一的名字,但這次它綁定到一個函數。這成爲課堂的內容。
現在,當你實例這個類testb()
,Python中發現__init__
在類並調用新的實例功能。該函數的執行會在新實例中創建一個變量a
實例變量。因此,testb()
的每個實例都有自己的變量,並且您會看到所觀察到的行爲。
帶回家的消息:在Python class
塊不只是一組包含在該類的實例,與傳統的面向對象十歲上下的語言,如C++和Java的東西聲明。這是實際執行的代碼,用於定義類的內容。這可以非常方便:您可以在您的類體內使用if語句,函數執行的結果以及任何其他上下文中使用的任何內容來決定在類中定義什麼。
(注意:我騙了簡單甚至早實例testa
會有一些實例變量,因爲有一些默認情況下所有實例自動創建的,但你沒有看到他們在一天多。一天的Python)。
來源
2011-09-30 06:48:52
Ben
您在字符串,整數和列表之間所看到的差異是列表是可變的,但字符串和整數是不可變的。您不能更改字符串的值。您可以綁定到不同的字符串。 –
字符串和整數也被創建爲類變量。只是你不能在一個int上調用'append',你必須用一個賦值重新綁定它。這會創建一個** new ** int對象作爲實例變量(除非您在類中重新綁定它),並將類變量隱藏(對於特定實例),但保持不變。 – Ben
好像我們最近已經得到了這個問題的幾十個變種...... –