我对python还不熟悉(大约一个月),我真希望我早一点就开始使用它(在使用perl多年之后)。在
问题:我希望对象根据其类型对同一方法调用具有不同的功能。这些方法在运行时根据加载的模块(组成所有对象)分配。在
问题:我想知道是否有一种流行的设计模式可以代替下面的设计模式,或者它是否已经有了一个设计模式的名称(很遗憾,我没有正式的CS背景,知道这将有助于我的文档)?
我有一个类层次结构(到现在为止,其中26个有3个基类)。只有基类有一些简单的方法(例如:add_child),并且每个派生类只使用新的数据属性(特定于派生类)扩展基类,必要时重写方法(例如:uu str_uu)。在
我处理的是树,其中节点属于不同的类。但是,节点应该具有相同的方法名(stringify,print_tree,emit,eval,transform_X等),从而允许简单/盲目的迭代器操作。每个方法可能执行不同的操作,但这些方法具有相同的调用名(如多态性)。在
我主要想根据节点的类型授予节点特定的能力(方法)。最初,我使用Visitor Pattern实现了这一点。但是,考虑到我是在Python中工作,我意识到我其实不必这么做。在
在下面的示例中,我有动态分配给类的方法。注意,在下面的例子中,迭代/递归方法调用名(print_tree)与函数名(generic__print_tree)不同。在#astmethods.py
def generic__print_tree(self, level=1):
"""
Desc: print nodes with indentation
Target: Any tree node
"""
print("{}> {}".format('-' * level, self))
for child in self.children:
child.print_tree((level + 1))
def ASTNode__stringify(self):
"""
Desc: Return string representation of the tree under this node
Target: AST/CFG nodes
"""
text = str(self)
for child in self.children:
text += ", { " + child.stringify() + " }"
return text
最后,main模块有这个函数,extend_types(),它在模块初始化期间被调用。在这个模块的上下文中,根据节点的类型(而不是值),节点将执行不同的操作。除非被重写,否则指定的方法将被继承。在
^{pr2}$
编辑:删除了分散注意力的信息,以单个模块上下文为例