<h3>查找顺序中没有“类范围”</h3>
<p>创建新类时,将执行主体中的代码,并将生成的名称传递给<code>type</code>进行创建。Python的查找是从内部到外部进行的,但是您没有“类级别”,只有定义为新类的属性/方法的名称。实际上,如果要访问方法中的类变量,可以使用<code>MyClass.attr</code>而不是简单的<code>attr</code>。你知道吗</p>
<p>继承之所以有效,是因为<code>InnerSubClass(InnerClass)</code>发生在类创建内部。要在创建<code>MainClass</code>之后访问<code>InnerClass</code>,请执行与类属性相同的操作:<code>MainClass.InnerClass</code></p>
<p>举个例子:</p>
<pre><code>class Outer:
out = 1
class Inner:
inside = 2
try:
print(out) # this is confusing
except NameError:
print("can't find out")
def f(self):
try:
print(inside) # this is clear
except NameError:
print("can't find inside")
try:
print(Inner.inside) # this is less clear
except NameError:
print("can't find Inner.inside")
Outer.Inner().f()
# can't find anything
</code></pre>
<p>编辑:</p>
<p>上面是一个通用视图,要将其直接应用于您的情况,请以查看常规类属性的方式查看内部类。您可以作为<code>MyClass.attr</code>访问它们,其中<code>MyClass</code>是全局定义的。如果用<code>InnerSubClass</code>替换<code>attr</code>,则得到类(属性查找不关心继承,而是关心属性的位置)。你知道吗</p>
<p>嵌套继承类的精简示例:</p>
<pre><code>class MainClass(object):
class Inner(object):
pass
class InnerSub(Inner):
def __init__(self):
print(super(MainClass.InnerSub)) # note you use MainClass, known globally
def f(self):
return self.InnerSub()
MainClass().f() # prints "<super ...>" and returns a MainCLass.InnerSub object
</code></pre>