我有一些图形处理功能。它定义了一个类Edge和my_graph_algo:
class Edge:
def connectsNodes(self, n1, n2):
....
def my_graph_algo(edge, more args):
...
x = edge.connectsNodes(...)
...
e = Edge()
my_graph_algo(e)
到目前为止,没什么特别的。
现在让我们想一下Friendship
和Road
:
class Friendship:
def areFriends(self, f1, f2):
...
class Road:
def connectsTowns(self, t1, t2):
...
这些表现出与图形边缘相同的行为:它们连接两件事。因此,我们可能希望my_graph_algo(...)
使用Friendship
或Road
作为参数。很遗憾,它们与my_graph_algo(...)
不兼容,因为它们不提供connectsNodes
,但它们提供语义相同的areFriends
和connectsTowns
。
所以我想以某种方式在函数调用时动态重命名/别名这些函数,如:
f = Friendship()
my_graph_algo(f see areFriends as connectsNodes) # here
r = Road()
my_graph_algo(r see connectsTowns as connectsNodes) # and here
我知道在这种情况下可以使用的一些技术,但这些并不是我所要求的:
Friendship
和Road
定义为Edge
的子类型,提供函数connectsNodes
。如果您不能或不想更改这些课程,那就太糟糕了。Friendship
和Road
适应Edge
。如果你想使用这样的"别名"各种情况下的技术。my_graph_algo(...)
。是否有一个解决方案不需要修改现有的类/函数,也不需要引入其他类?可以提供重命名/别名的东西。
此外:如果参数edge
实际上是表示边缘的对象列表,它将如何显示。
这个问题既实用又有点学术性。
答案 0 :(得分:0)
您可以在类中添加Friendship.connectsNodes = Friendship.areFriends
这样的别名,但它只能在本地使用。如果从另一个文件导入它,它不会影响该类。
您的示例代码:
class Edge:
def connectsNodes(self, n1, n2):
return n1+n2
def my_graph_algo(edge):
n1, n2 = 2, 5
x = edge.connectsNodes(n1, n2)
return x
e = Edge()
print(my_graph_algo(e))
class Friendship:
def areFriends(self, f1, f2):
return f1-f2
class Road:
def connectsTowns(self, t1, t2):
return t1*t2
Friendship.connectsNodes = Friendship.areFriends
f = Friendship()
print(my_graph_algo(f))
Road.connectsNodes = Road.connectsTowns
r = Road()
print(my_graph_algo(r))