我正在尝试理解分配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__
属性,但我不能用它来引用它。我知道这有点笼统,但有人可以解释Foo
和Foo.__name__
之间的关系吗?
答案 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__
只是附加到类对象的一条信息,它恰好与它最初分配给它的变量名相同。