<p>这是可能的,但是您必须先完成类的定义,然后才能实例化它</p>
<pre><code>class A:
def __init__(self):
self.B = 1
def doSomething(self):
print(self.B)
A.c = A()
</code></pre>
<hr/>
<p><code>class</code>语句提供了一种比显式调用<code>type</code>更具声明性的方法来创建类。以上相当于</p>
<pre><code>def A_init(self):
self.B = 1
def A_doSomething(self):
print(self.B)
A = type("A", (), {'__init__': A_init, 'doSomething': A_doSomething})
del A_init, A_doSomething
</code></pre>
<p>必须先完成对<code>type</code>的调用,然后才能将<code>A</code>的实例添加到作为第三个参数传递给<code>type</code>的<code>dict</code>中</p>
<hr/>
<p>您可能会发现装饰器使类属性的添加更“原子化”:</p>
<pre><code>def add_instances(*names):
def _(cls):
for name in names:
setattr(cls, name, cls())
return cls
return _
@add_instances("c", "d", "e")
class A:
def __init__(self):
self.B = 1
def doSomething(self):
print(self.B)
</code></pre>
<p>将导致<code>A.c</code>、<code>A.d</code>和<code>A.e</code>都引用<code>A</code>的不同实例。请注意<code>add_instances</code>没有对应用它的类做出任何假设,只是假设它可以在没有任何参数的情况下实例化</p>
<hr/>
<p>如果您想知道为什么可以通过引用当前定义的函数来编写递归函数:</p>
<pre><code>def factorial(n):
return 1 if n == 0 else n*factorial(n-1)
</code></pre>
<p>不同之处在于<code>def</code>语句的主体在对<code>def</code>语句本身进行求值时,只进行<em>分析</em>,而不是求值。一个<code>class</code>语句的主体被一个语句一个语句地<em>求值,以生成一个传递给<code>type</code>的<code>dict</code></p>