重命名/别名方法实例名称(在Python中)

时间:2016-04-03 15:19:08

标签: python

我有一些图形处理功能。它定义了一个类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)

到目前为止,没什么特别的。

现在让我们想一下FriendshipRoad

class Friendship:
    def areFriends(self, f1, f2):
        ...

class Road:
    def connectsTowns(self, t1, t2):
        ...

这些表现出与图形边缘相同的行为:它们连接两件事。因此,我们可能希望my_graph_algo(...)使用FriendshipRoad作为参数。很遗憾,它们与my_graph_algo(...)不兼容,因为它们不提供connectsNodes,但它们提供语义相同的areFriendsconnectsTowns

所以我想以某种方式在函数调用时动态重命名/别名这些函数,如:

f = Friendship()
my_graph_algo(f see areFriends as connectsNodes) # here

r = Road()
my_graph_algo(r see connectsTowns as connectsNodes) # and here

我知道在这种情况下可以使用的一些技术,但这些并不是我所要求的:

  1. FriendshipRoad定义为Edge的子类型,提供函数connectsNodes。如果您不能或不想更改这些课程,那就太糟糕了。
  2. 创建适配器类,使FriendshipRoad适应Edge。如果你想使用这样的"别名"各种情况下的技术。
  3. 在函数调用时定义一个lambda函数,"重定向"各自的方法。需要更改my_graph_algo(...)
  4. 是否有一个解决方案不需要修改现有的类/函数,也不需要引入其他类?可以提供重命名/别名的东西。

    此外:如果参数edge实际上是表示边缘的对象列表,它将如何显示。

    这个问题既实用又有点学术性。

1 个答案:

答案 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))