2012-04-30 36 views
48

我不知道是否有的Python:自.__ class__與類型(個體經營)

class Test(object): 
    def __init__(self): 
     print self.__class__.__name__ 

class Test(object): 
    def __init__(self): 
     print type(self).__name__ 

之間的差異?

是否有理由選擇其中一種?

(在我的使用情況下,我想用它來確定記錄器的名字,但我想這並不重要)

+5

[類型(obj)和obj。\ _ \ _ class \ _ \ _之間的差異可能重複(http://stackoverflow.com/questions/1060499/difference-between-typeobj-and-obj-class) – user

+0

@用戶,並且在某些情況下它們在Python 3中有區別(參見Flavien's [answer](http://stackoverflow.com/a/10633356/704244)) –

回答

31
>>> class Test(object): pass 
>>> t = Test() 
>>> type(t) is t.__class__ 
True 
>>> type(t) 
__main__.Test 

所以這兩個是一樣的。 我會使用 self.__class__,因爲它更明顯。

然而,type(t)不會爲老式類工作,因爲舊式類的實例的類型是instance而新風格的類實例的類型是同級車:

>>> class Test(): pass 
>>> t = Test() 
>>> type(t) is t.__class__ 
False 
>>> type(t) 
instance 
+9

真的嗎?你可以通過'type(self)'來訪問'self .__ class__'?我認爲後者更清晰,輸入更少,更一致 - 我懷疑你會在len([1,2,3])上執行'[1,2,3] .__ len __()''。 –

+9

'len()'告訴你它做了什麼 - 但'type(self)'並沒有立刻告訴你「給你這個類」 – ThiefMaster

+5

Python的早期版本,Type和Class在Python中是同義詞,所以我猜我不是那樣看的。 –

4

據我所知,後者僅僅是一個做的更好的方式前任的。

這實際上在Python中並不罕見,請考慮repr(x),它只是叫x.__repr__()len(x),它只叫x.__len__()。 Python傾向於使用內置函數來處理可能在一系列類中使用的常用函數,並且通常通過調用__x__()方法來實現這些功能。

相關問題