【发布时间】:2015-12-26 00:12:43
【问题描述】:
我有一个样板类,它将一些操作委托给一个参考类。它看起来像这样:
class MyClass():
def __init__(self, someClass):
self.refClass = someClass
def action1(self):
self.refClass.action1()
def action2(self):
self.refClass.action2()
def action3(self):
self.refClass.action3()
这是 refClass:
class RefClass():
def __init__(self):
self.myClass = MyClass(self)
def action1(self):
#Stuff to execute action1
def action2(self):
#Stuff to execute action2
def action3(self):
#Stuff to execute action3
我想使用 Python 元编程来使它更优雅和可读,但我不确定如何。
我听说过setattr 和getattr,我想我可以做类似的事情
class MyClass():
def __init__(self, someClass):
self.refClass = someClass
for action in ['action1', 'action2', 'action3']:
def _delegate(self):
getattr(self.refClass, action)()
然后我知道我需要从某个地方执行此操作,我猜:
MyClass.setattr(action, delegate)
我就是不能完全理解这个概念。我了解有关不重复代码以及使用带有函数式编程的 for 循环生成方法的基础知识,但是我不知道如何从其他地方调用这些方法。嘻嘻!
【问题讨论】:
-
不能 RefClass 继承 MyClass 并覆盖方法吗?
-
很可能是我的架构设计不是最好的,@Pynchia!这可能超出了问题的范围,但此代码是文本编辑器 GUI 的一部分。有视图(用于菜单、文本区域等),每个视图都由控制器类(MenuController、TextAreaController 等)控制。当从菜单触发的动作需要修改文本区域时,我将动作委托给 MainController,它负责设置整个 GUI 并处理暗示多个控制器的动作。所以我认为继承在这里不是一个可能的解决方案。
标签: python metaprogramming dry getattr setattr