Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python类变量名与_名称___Python_Class - Fatal编程技术网

Python类变量名与_名称__

Python类变量名与_名称__,python,class,Python,Class,我试图理解Python类对象分配给的变量与该类对象的\uuu name\uuu属性之间的关系。例如: 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 ---------------------------------

我试图理解Python类对象分配给的变量与该类对象的
\uuu name\uuu
属性之间的关系。例如:

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
[1]中的
:类Foo(对象):
…:通过
...: 
在[2]中:Foo.\uuuuu name\uuuuuuu='Bar'
在[3]中:Foo.\u名称__
Out[3]:“Bar”
在[4]中:Foo
Out[4]:_uu主工具栏
In[5]:Bar
---------------------------------------------------------------------------
NameError回溯(最近一次呼叫上次)
在()
---->1巴
NameError:未定义名称“Bar”

因此,似乎我已经更改了类的
\uuuu name\uuu
属性,但我不能用该名称来引用它。我知道这有点笼统,但有人能解释一下
Foo
Foo.\uuuu name\uuuu
之间的关系吗?

很简单。根本没有关系

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

该类还获取一个属性
\uuuuu name\uuuuuu
,该属性包含该变量的名称,因为在某些情况下,如pickle,这很方便


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

\uuu name\uuuuuuu
仅仅是自我识别,以便了解它的实例是什么类型

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

它们都是在定义类时指定的

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


OTOH,如果你有一个
lambda
函数,它会得到
\uu name\uuu
属性,因为它不知道分配给它的名称。

短版本

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

Foo.\uuuu name\uuuu='Bar'
为属性
\uuuu name\uuuu
指定一个新值。封闭范围不受影响

长版本

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


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

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


\uuuuu name\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,如果你返回的是一个完全不同的类,那么是的。但是,您还可以使用
type()
调用构造该类,该调用设置
\uuuu name\uuu
。这就是我所看到的。虽然这并不能直接回答你的问题,但我建议你读一读内德·巴奇的书。我想你看完后能够回答自己的问题。谢谢大家,非常有用的信息。