2013-08-20 66 views
6

我想了解一個Python類對象被分配給的變量與該類對象的__name__屬性之間的關係。例如:Python類變量名vs __name__

In [1]: class Foo(object): 
    ...:  pass 
    ...: 

In [2]: Foo.__name__ = 'Bar' 

In [3]: Foo.__name__ 
Out[3]: 'Bar' 

In [4]: Foo 
Out[4]: __main__.Bar 

In [5]: Bar 
--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
<ipython-input-5-962d3beb4fd6> in <module>() 
----> 1 Bar 

NameError: name 'Bar' is not defined 

所以好像我已經改變了類的__name__屬性,但我不能用這個名字引用它。我知道這有點一般,但有人可以解釋FooFoo.__name__之間的關係嗎?

+4

雖然這並不直接回答你的問題,但我建議你閱讀Ned Batchelders的[關於Python名稱和值的事實和神話](http://nedbatchelder.com/text/names.html)。我認爲在閱讀之後你將能夠回答你自己的問題。 –

+0

謝謝大家,非常有幫助的信息。 – ACV

回答

9

很簡單。根本沒有關係。

當您創建一個類時,將使用您使用的名稱創建一個局部變量,指向該類以便您可以使用它。

該類還獲得一個屬性__name__,其中包含該變量的名稱,因爲在某些情況下,如酸洗很方便。

您可以將局部變量設置爲其他值,或者更改__name__變量,但酸洗等操作不起作用,所以不要這樣做。

+0

雖然有更改'__name__'的理由,當你創建一個類裝飾器。 – nneonneo

+0

好吧,如果你在裝飾器中返回一個完全不同的類,是的。但是你也可以用'type()'調用來構造那個類,它調用'__name__'。這是我看到它完成的。 –

3

__name__僅僅是自我識別,或者知道它的實例是什麼類型。

另一件事是它可以被訪問的方式。如果您重新分配,這可能會有所不同。

它們都是在您定義類時分配的。

它與函數的作用方式相同:如果您def他們,他們被分配給給定的名稱,他們得到各自的__name__屬性。

OTOH,如果您有lambda函數,則它的__name__屬性爲<lambda>,因爲它不知道它被分配的名稱。

1

短版

class Foo(object): pass創建一個類,並將其分配給本地名稱Foo

Foo.__name__ = 'Bar'爲屬性__name__分配一個新值。封閉範圍不受影響。

龍版

類語句創建一個類,並分配給在本地範圍內提供的名稱。當創建一個類時,Python通過將其分配給該類的__name__屬性來告訴該類的創建名稱。

分配給類的屬性不會在本地作用域中引入名稱。因此對屬性的任何更改(例如__name__)都不會影響封閉範圍。

0

你需要記住,在Python中,一個類只是一個像其他任何對象一樣。對象包含一個鏈接到引用該對象的變量的屬性是沒有意義的,因爲可能有任何數量的變量名稱引用該對象。無論何時您寫作業(Bar = Foo)或將對象傳遞給函數,都有新的參考。當然,所有對象都必須獨立於它們的引用方式。

__name__只是附加到類對象的一條信息,恰好與最初分配給它的變量名相同。