2011-03-22 169 views
0

的假設我有這樣類型的實例變量

class Employee: 
    pass 

I類創建Employee兩個對象,如下

john = Employee() 
rob = Employee() 

..和創建實例變量

john.age = 12 
rob.age = '15' 

編譯器接受並打印年齡(int中的約翰氏年齡和年的盜賊年齡)。這是如何合乎邏輯的?每個對象中具有不同類型的相同數據屬性。

謝謝。

+0

這將導致一個'AttributeError'。 Employee類在類定義中有一個屬性age,或者它是一個描述符。 – 2011-03-22 11:18:37

+0

我沒有得到一個。它剛剛起作用;我可以同時打印'age's – bdhar 2011-03-22 11:21:40

+1

@ Space_C0wb0y:不會。 Python類型需要使用'__slots__'來強制實施屬性名稱限制。 – 2011-03-22 11:29:24

回答

7

請務必理解這個基本原理:Python中的變量沒有類型。 有類型。這是Python的動態類型語言的本質,類似於Lisp和Javascript,但與C,C++和Java不同。

>>> foo = 5  # foo now holds a value of type int 
>>> foo = 'hello' # foo now holds a value of type string 

這裏有一個從維基百科的entry on typing摘錄在Python:

Python使用鴨打字,並鍵入 對象,但無類型變量名。 類型約束不在 編譯時檢查;相反,對象 上的操作可能會失敗,表示給定對象的 類型不是合適的 類型。儘管是動態輸入的,但是 Python是強類型的,禁止 操作沒有明確定義 (例如,向 字符串添加數字)而不是默默地 試圖理解它們。

如果您想學習Python,請閱讀此主題的更多內容(特別是Duck Typing是什麼)。


P.S.這個問題與對象的屬性完全正交。屬性只是Python中的其他「變量」,它也可以保存值。這些值可以是不同的類型。

1

從根本上說,當你有動態類型語言時,你會得到什麼。

類型在運行時不在聲明時確定。

它有優點和缺點,但我認爲在大多數開發環境中,它的優點大於它的缺點。

(這是什麼的Ruby,Python和PHP等做)

1

Python的編譯器不關心你綁定什麼類型的值的屬性/名稱,也不需要; Python的動態特性意味着重要的類型檢查(通常實際屬性檢查)是在運行時完成的。

2

因爲通過說rob.age你是而不是創建一個具有特定類型的類的數據屬性;你只是創建一個實例本地的,特定於實例的屬性,它指向一個具體的實體,即字符串'15'。要創建一個類範圍的屬性,你不得不說Employee.age = …或設置ageclass Employee:塊內。通過將屬性設置爲描述符,我想你可以在每次設置時檢查它的類型,並將其限制爲一個整數或字符串或其他;但一般來說,類屬性或實例屬性只是對象的名稱,所有Python的關心是.age命名對象。

並注意Python中不能真正猜測你是什麼意思呢。如果你說john.age是12,你似乎希望Python猜測所有其他.age屬性也應該是數字。但爲什麼Python不應該更進一步,並且猜測它們是整數 - 或者更好呢,它們甚至是整數都是正數?我真的不認爲在任何情況下,從一個任務推斷出某種猜測對於如何在該類的所有其他實例中處理該屬性都是合理的。

0

術語「可變的」 是 confusioning在Python。