2009-12-08 35 views
1

部分代碼。「type」的第一個參數是做什麼的?

In [1]: A = type('B',(), {}) 

In [2]: a = A() 

In [3]: b = B() 
--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 

/home/shabda/<ipython console> in <module>() 

NameError: name 'B' is not defined 

type在這裏做的第一個參數是什麼?

回答

2

它設置創建的類的__name__屬性。

當你說:

class B(object): 

發生兩件事情與 'B':

  • 名稱 'B' 被分配的類。這就像如果你說「B = ...」。

  • 該類的__name__屬性設置爲'B'。

當您手動調用類型構造函數時,只完成後半部分。如果您沒有將結果賦值給'B',那麼B將保持原來的設置(或未設置)。

注意,類似的結果可以說獲得:

class B(object): 
    pass 
A = B 
del B 

現在指的是自稱爲「B」類和B並未提及任何東西。

0

它創建一個新的類名爲B

Python 2.5.4 (r254:67916, Nov 19 2009, 22:14:20) 
[GCC 4.3.4] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> type('B',(), {}) 
<class '__main__.B'> 

typehere第二種形式獲取更多信息。

當您將調用type的結果分配給一個變量時,您只需將類別B賦予另一個名稱即可。這相當於做

>>> class B(object): 
...  pass 
... 
>>> A = B 
>>> a = A() 
>>> b = B() 
0

「B」僅僅是一個字符串,它是一個 一個地方使用它的名字將作爲類的默認__repr__及其對象

>>> A=type('B',(), {}) 
>>> A 
<class '__main__.B'> 
>>> a=A() 
>>> a 
<__main__.B object at 0xb7cf88ec> 

通常的方法來創建一個類沒有辦法明確設置__name__屬性。 在這種情況下,它是隱含在類的構造函數

>>> class A:pass 
... 
>>> A 
<class __main__.A at 0xb7cf280c> 

設置,但沒有什麼來自後更名

>>> A.__name__ 
'A' 
>>> A.__name__='B' 
>>> A 
<class __main__.B at 0xb7cf280c> 
>>> 
阻止你
相關問題