回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我正在用Jython编写一个文本编辑器。这个文本编辑器有一个工具栏,它用<code>ToolbarView</code>类显示,并由<code>ToolbarController</code>类处理。有些操作不能由<code>ToolbarController</code>单独处理,因此这些操作被委托给<code>MainController</code>类。在</p>
<p>为了避免重复代码,因为有很多操作从<code>ToolbarController</code>委托给主控制器,我使用了getattr,正如我在上一个问题<a href="https://stackoverflow.com/questions/32828305/setattr-and-getattr-with-methods">here</a>中建议的那样。我还意识到我可以在<code>ToolbarView</code>代码中使用相同的机制来执行按钮的操作,但我无法使其工作,最终得到一个无限循环和一个<code>Java StackOverflowError</code>。在</p>
<p>以下是相关代码的摘录:</p>
<p><strong>工具栏视图</strong>类:</p>
<pre><code>from javax.swing import JToolBar, ImageIcon, JButton
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=getattr(self, method))
self.add(button)
def __getattr__(self, name):
return getattr(self.controller, name)
</code></pre>
<p><strong>工具栏控制器</strong>类:</p>
^{pr2}$
<p><strong>main控制器</strong>类:</p>
^{3}$
<p>所以我期望的是,当我单击按钮时,<code>MainController.onNewFileClick</code>将被执行并在控制台中打印出该消息。如果我想从<code>ToolbarView</code>委托给<code>ToolbarController</code>,它可以工作,但是当我把这个委托从<code>ToolbarController</code>传递给主控制器时,它就不起作用了。它似乎在一个无限的循环中自我调用。我得到的错误是:</p>
<pre><code>Traceback (most recent call last):
File "main.py", line 3, in <module>
MainController()
File "/home/training/Jython/controller/MainController", line 8, in __init__
self.toolbarController = ToolbarController(self)
File "/home/Jython/controller/ToolbarController.py", line 8, in __init__
self.view = ToolbarView(self)
File "/home/Jython/controller/ToolbarView.py", line 44, in __init__
button = JButton(name, actionPerformed=getattr(self, method))
File "/home/Jython/controller/ToolbarView.py", line 54, in __getattr__
return getattr(self.controller, name)
File "/home/Jython/controller/ToolbarController.py", line 15, in __getattr__
return getattr(self.mainController, name)
File "/home/Jython/controller/ToolbarController.py", line 15, in __getattr__
return getattr(self.mainController, name)
[...]
File "/home/Jython/controller/ToolbarController.py", line 15, in __getattr__
return getattr(self.mainController, name)
RuntimeError: maximum recursion depth exceeded (Java StackOverflowError)
</code></pre>
<p>我做错什么了?我在python中尝试过类似的方法(从一个类委托给另一个类),如果在getattr后面加一个put <code>()</code>就可以了,但是这里我感到困惑,因为JButton中的<code>actionPerformed</code>。我试过了,但结果是一样的。在</p>