2017-04-23 43 views
0

請看下面的示例。創建混淆的Python類分配

>>> class X: 
     pass 
>>> Y = X 
>>> X 
<class '__main__.X'> 
>>> Y 
<class '__main__.X'> 
>>> Y == X 
True 
>>> Y is X 
True 

上面的代碼是可以理解的。但是,看看下面的一個。

>>> X = type('X',(), {}) 
>>> Y = type('X',(), {}) 
>>> X 
<class '__main__.X'> 
>>> Y 
<class '__main__.X'> 
>>> X == Y  # Shouldn't this be True?? 
False 
>>> X is Y 
False 

這裏X is Y == False與預期的一樣。但是怎麼來X == YFalse? 他們都是同一班級的,不是嗎?

+2

這個問題的簡短答案:類不能與'=='進行比較,因爲沒有人實現該功能;並且'a == b'(如果沒有被覆蓋)的標準行爲是返回'a is b'。 –

+0

@Rawing評論更有意義。 :d – RatDon

回答

1

當您使用class聲明,兩件事情發生。首先,使用您指定的名稱創建一個類。也就是說,該類具有該字符串作爲其值的__name__屬性。其次,該類作爲變量分配給該名稱。

>>> class X: 
     pass 
>>> X.__name__ 
'X' 
>>> Y = X 
>>> Y.__name__ 
'X' 

當您打印類,它顯示你的__name__值:

>>> X 
<class '__main__.X'> 
>>> Y 
<class '__main__.X'> 

正如你當你將X到Y,變量的名稱可見,和的名字類,可以是不同的。

當您使用type創建類時,您每次都會創建一個新的獨特類。你可以有兩個具有相同__name__的類,每個類都分配給不同的變量。這就是你在這裏所做的:

>>> X = type('X',(), {}) 
>>> Y = type('X',(), {}) 
>>> X 
<class '__main__.X'> 
>>> Y 
<class '__main__.X'> 
>>> X.__name__ 
'X' 
>>> Y.__name__ 
'X' 
1

根據docs:'...有三個參數,返回一個新的類型對象'。

>>> X1 = type('X',(), {}) 
>>> Y1 = type('X',(), {}) 
>>> id(X1) == id(Y1) 
False 

而第一個例子Y '引用' X:

>>> class X: 
...  pass 
... 
>>> Y = X 
>>> id(X) == id(Y) 
True