擅长:python、mysql、java
<p>是的,这是可能的:</p>
<pre class="lang-py prettyprint-override"><code>class A:
"""
This is a class retaining some constants
"""
C = 1
class B:
VAR = None
def __init__(self):
self.VAR = A
def f(self, v=None):
if v is None:
v = self.VAR
print(v.C)
clb = B()
clb.f()
</code></pre>
<p>问题是默认参数<code>v=VAR</code>是对<code>B.VAR</code>的旧引用,它是<code>None</code>,而不是对象<code>clb.VAR</code>的更新值</p>
<p><a href="https://i.stack.imgur.com/h6Vgr.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/h6Vgr.png" alt="memory diagram"/></a></p>
<p>此图显示<code>f()</code>的旧版本有一个指向None的默认值v,因为这是在定义类B时,在创建clb:B对象之前,在方法定义时计算的,其中VAR是类属性。
我的建议是在运行时通过<code>self</code>使用对象的变量设置<code>v</code>,该变量在<code>__init__</code>中更改为<code>A</code></p>