python自己类型的静态字段

orl*_*dpm 2 python

我注意到python不会让你在类定义中将类的实例添加到自身作为静态成员.

>>> class Foo:
...     A = Foo()
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in Foo
NameError: name 'Foo' is not defined
Run Code Online (Sandbox Code Playgroud)

但是,以下任一工作:

>>> class Foo:
...     pass
... 
>>> class Foo:
...     A = Foo()
... 
>>> Foo.A
<__main__.Foo instance at 0x100854440>
Run Code Online (Sandbox Code Playgroud)

要么

>>> class Foo:
...     pass
... 
>>> Foo.A = Foo()
>>> 
>>> Foo.A
<__main__.Foo instance at 0x105843440>
Run Code Online (Sandbox Code Playgroud)

我找不到任何具有启发性的代码示例或解释.为什么python以不同的方式处理第一种情况?在随后的两个案例中,每个案件的A在哪里?

Ter*_*ryA 6

您的第一个示例不起作用,因为您尚未创建该类Foo.你正在这样做(因此NameError)

您的第二个示例有效,因为您有一个名为的类Foo().你覆盖它,但你仍然保留它的副本.看看这个:

>>> class Foo:
...     def __init__(self):
...             print 'hi'
... 
>>> class Foo:
...     A = Foo()
... 
hi
>>> Foo.A
<__main__.Foo instance at 0x101019950>
>>> Foo.A.__init__
<bound method Foo.__init__ of <__main__.Foo instance at 0x101019950>>
Run Code Online (Sandbox Code Playgroud)

A 是一个属性,它具有您覆盖的类的值.

至于你的第三个例子,你只是创建一个类的属性,它是类的一个实例.