2016-04-03 109 views
0

我有一些圖形處理功能。它定義了一個類Edge和my_graph_algo:實例的重命名/別名方法名稱(使用Python)

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(...)作爲參數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 

我知道,能在這種情況下可以使用一些技術,但它們不正是我「M詢問:

  1. 定義FriendshipRoad作爲Edge亞型,提供了一個功能connectsNodes。如果你不能或不想改變這些課程,那就很糟糕。
  2. 創建適配器類,其適配FriendshipRoadEdge。單調乏味,如果你想在各種情況下使用這種「別名」技術。
  3. 在函數調用時定義一個「重定向」到相應方法的lambda函數。將需要更改my_graph_algo(...)

是否有解決方案,不需要修改現有的類/函數,也不需要引入額外的類?一些可以提供重命名/別名權的地方。

此外:如果參數edge實際上是表示邊的對象列表,它將會如何顯示。

這個問題既實用又有點學術性。

+0

你想要的包裝 –

+0

我不這麼認爲。我解釋了爲什麼我想避免使用適配器/包裝器模式,並且我也沒有看到使用@的Python包裝技術在這裏可以如何幫助。也許2分鐘不足以完全理解我的帖子? ;-) – Michael

+1

帶有@的東西被稱爲裝飾器,而不是包裝器。如果你沒有使用包裝器,那麼答案是:不,Python不提供任何內置/標準函數/語法來執行你想要的操作 –

回答

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