2013-07-14 76 views
4

我在Python中使用metaclasses,發現一些非常好奇的東西。我可以創建兩個具有相同名稱的類,但實際上它們是不同的對象。請參閱:在Python中使用相同名稱創建的不同類?

>>> def create_class(**data): 
...  return type('MyClass', (object,), data) 
... 
>>> A = create_class(x=1, y=2) 
>>> B = create_class(x=1, y=2) 
>>> A 
<class '__main__.MyClass'> 
>>> B 
<class '__main__.MyClass'> 
>>> A == B 
False 
>>> a = A() 
>>> b = B() 
>>> type(a) 
<class '__main__.MyClass'> 
>>> type(b) 
<class '__main__.MyClass'> 
>>> type(a) == type(b) 
False 

我認爲名稱空間內的名稱應該是唯一的。那麼情況不是這樣嗎?

+0

你能解釋一下名字空間中的名字應該是唯一的嗎? – User

+0

@使用名稱空間中每個對象的名稱(在本例中爲'__main__')應該是唯一的。我認爲'MyClass'是一個對象的名稱,正如下面的答案所解釋的那樣,它不是。 – erickrf

回答

6

名稱空間中的名稱是唯一的,但這對您的情況沒有任何影響。基本上有兩個不同的東西:「名字」和__name__ s。 「名稱」是名稱空間中的變量。 A __name__只是一個類的屬性,其值是「類調用自己」。

在上面的代碼中,MyClass__name__AB是名稱。 MyClass不是__main__命名空間中的名稱。您看到的「__main__.MyClass」類只是該類的__name__屬性,而不是名稱空間中的實際變量。通常,該課程的__name__將與您定義的名稱相同,但如果您通過像調用type那樣以編程方式創建課程,它仍將具有__name__,但不一定可通過名稱空間中的任何名稱進行訪問。

區別在這裏的一個簡單的例子:

>>> A = type('MyClass', (object,), {}) 
>>> MyClass 
Traceback (most recent call last): 
    File "<pyshell#3>", line 1, in <module> 
    MyClass 
NameError: name 'MyClass' is not defined 

剛好路過MyClasstype實際上並沒有創建一個名爲MyClass變量。正是這些實際的變量名是唯一的,而不是其名稱的內部概念。

如果一個類是相同的類對象,則它與另一個類相同。即使它們具有相同的__name__屬性,它們仍然可以是不同的對象。

+1

@erickrf:請注意[**類定義**](http://docs.python.org/2/reference/compound_stmts.html#class-definitions)文檔中第一段的最後一句,它表示「類名稱綁定到原始本地名稱空間中的此類對象「。換句話說,可執行的'class'語句將創建的類對象分配給本地名稱空間中的同名變量。當你通過調用'type()'來創建類時,它不會自動發生。 – martineau

5

該類的名稱是類對象本身的屬性。通常當你定義一個類時,你將它綁定到一個變量(帶有類名),但類名仍然會存儲在類對象本身中。

在你的情況,你正在做兩個新的對象是不同的,但碰巧都是類,並具有相同的名稱。而且它們不像正常類那樣綁定到名稱空間中的變量。

相關問題