Python类变量名称vs __name__

时间:2013-08-20 03:56:24

标签: python class

我正在尝试理解分配Python类对象的变量与该类对象的__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 个答案:

答案 0 :(得分:9)

这很简单。根本没有任何关系。

创建类时,会使用您使用的名称创建局部变量,指向该类以便您可以使用它。

该类还获得一个属性__name__,其中包含该变量的名称,因为在某些情况下这很方便,比如酸洗。

你可以将局部变量设置为其他东西,或者更改__name__变量,但是接下来的东西不会起作用,所以不要这样做。

答案 1 :(得分:3)

__name__仅仅是自我识别,或者知道它的实例是什么类型。

另一件事就是它的访问方式。如果你重新分配它可能会有所不同。

它们都是在您定义类时分配的。

它与函数的工作方式相同:如果你def,则会将它们分配给给定的名称,并获得相应的__name__属性。

OTOH,如果您有lambda函数,则会获得__name__ <lambda>属性,因为它不知道它被分配给的名称。

答案 2 :(得分:1)

简短版

class Foo(object): pass创建一个类并将其分配给本地名称Foo

Foo.__name__ = 'Bar'为属性__name__分配新值。封闭范围不受影响。

长版

class语句创建一个类并分配给本地范围中提供的名称。创建类时,Python通过将类指定给类的__name__属性来告诉类创建它的名称。

分配给类的属性不会在本地范围中引入名称。因此,对属性的任何更改(例如__name__)都不会影响封闭范围。

答案 3 :(得分:0)

你需要记住,在python中,一个类只是一个像任何其他对象一样的对象。对象包含链接到引用该对象的变量的属性是没有意义的,因为可能有任意数量的变量名称引用它。每次编写赋值(Bar = Foo)或将对象传递给函数时,都会有新的引用。当然,所有对象必须独立于它们的引用方式。

__name__只是附加到类对象的一条信息,它恰好与它最初分配给它的变量名相同。