9

我试图了解分配给 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

4 回答 4

10

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

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

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

您可以将局部变量设置为其他变量,或者更改__name__变量,但是酸洗之类的操作将不起作用,所以不要这样做。

于 2013-08-20T04:03:49.063 回答
4

__name__仅仅是自我识别,以便知道它的实例到底是什么类型。

另一件事是可以访问它的方式。如果您重新分配它,情况可能会有所不同。

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

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

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

于 2013-08-20T04:04:29.333 回答
2

简洁版本

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

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

长版

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

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

于 2013-08-20T04:18:05.887 回答
0

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

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

于 2013-08-20T05:14:56.497 回答