2013-05-12 78 views
6

我對我自己的學習Python類,現在和整個這個頁面來了:Python類中的公共變量?

http://www.tutorialspoint.com/python/python_classes_objects.htm

變量empCount是一個類變量,其值將 一個此類的所有實例共享。這可以從課堂內部或課堂以外的 Employee.empCount進行訪問。

我假設這被稱爲公共變量?或者一個靜態的公共變量?

這是技術上的良好做法嗎?我知道這個問題有點軟,但總的來說,像self.var(在init或其他類中聲明的)與像這樣的公共變量一樣的類變量是否更好?

+0

它簡單地稱爲類屬性。它們等同於C++的靜態數據成員。 – 2013-05-12 17:47:00

回答

5

它被稱爲類屬性。 Python不區分公共和私人;隱私只是按照慣例表示,並沒有強制執行。

如果您需要在實例之間共享數據,這在技術上是很好的做法。請記住,方法也是類屬性!

+0

所以如果我的程序是所有關於連接到遠程API並拉入數據,將URL存儲爲「類屬性」還是作爲self.URL變量(對不起,我不知道你稱之爲什麼) – 2013-05-12 17:48:28

+0

實例屬性 - no , 不是真的。使用類屬性作爲默認值(在實例上設置相同的名稱會掩蓋類屬性),需要在所有實例之間共享的狀態,或創建新實例時需要更改的數據(例如計數器,以便爲每個實例生成唯一的ID )。 – 2013-05-12 18:20:00

1

區別在於,如果變量是在__init__構造函數中聲明的,則變量對於不同的類變量表示不同。 (即)如果該類有兩個對象,則每個變量都有不同的內存空間。如果聲明爲empcount,則該類的所有對象將共享或訪問相同的內存空間。在這種情況下,創建的每個對象都會將empcount的值增加1。因此,當一個變量要被所有對象共享時,請使用這種靜態聲明。但是改變這個變量會影響類的所有對象。

+0

因此,即使許多對象可能在類中實例化並且empcount = 0,它只會在第一次實例化類時被初始化爲0(然後通過init增加1)? – 2013-05-12 17:53:32

+0

是的。無論何時調用構造函數,empcount值都會增加1,因此'empcount'值會給出類的對象數量。 – 2013-05-12 17:55:00

+0

如上所述,這相當於初始化靜態變量c – 2013-05-12 18:08:23