<p>你好像在用<code>Jython</code>,我真的不知道。无论如何,在python中,您重写了<code>__getattr__</code>,那么您应该期望<code>getattr</code>使用被重写的钩子。所以我觉得你的意思是:</p>
<pre><code>class ToolbarView(JToolBar):
def __init__(self, controller):
#Give reference to controller to delegate action response
self.controller = controller
options= ['NewFile', 'OpenFile', 'SaveFile', 'CloseFile']
for option in options:
methods[option] = "on" + option + "Click"
print methods[option]
for name, method in methods.items():
button = JButton(name, actionPerformed=super(ToolbarView, self).__getattr__(method))
self.add(button)
def __getattr__(self, name):
return getattr(self.controller, name)
</code></pre>
<p>观察按钮是如何创建的。在</p>
<p>至于为什么会有这样的问题,那是因为<code>getattr</code>是如何处理的。如果重写<code>__getattr__</code>,则只有在尝试引用未定义的字段时才会调用此钩子:</p>
^{pr2}$
<p>希望现在钩子是怎么工作的。在</p>
<p>所以so实际上是因为您引用了不属于<code>MainController</code>的内容。在</p>
<p>在您的<code>MainController</code>中,只定义了<code>onNewFileClick</code>,但您定义了3个其他选项:</p>
<pre><code>options= ['NewFile', 'OpenFile', 'SaveFile', 'CloseFile']
</code></pre>
<p>所以,这将发生在第二轮迭代中。由于<code>MainController</code>没有<code>onOpenFileClick</code>,一个<code>AttributeError</code>将被引发,但被<code>ToolbarController</code>捕获,因此被重写的{<cd2>}将被调用并打开。这就是你的调用堆栈爆炸的原因。在</p>