我有一些圖形處理功能。它定義了一個類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(...)
作爲參數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
我知道,能在這種情況下可以使用一些技術,但它們不正是我「M詢問:
- 定義
Friendship
和Road
作爲Edge
亞型,提供了一個功能connectsNodes
。如果你不能或不想改變這些課程,那就很糟糕。 - 創建適配器類,其適配
Friendship
和Road
至Edge
。單調乏味,如果你想在各種情況下使用這種「別名」技術。 - 在函數調用時定義一個「重定向」到相應方法的lambda函數。將需要更改
my_graph_algo(...)
。
是否有解決方案,不需要修改現有的類/函數,也不需要引入額外的類?一些可以提供重命名/別名權的地方。
此外:如果參數edge
實際上是表示邊的對象列表,它將會如何顯示。
這個問題既實用又有點學術性。
你想要的包裝 –
我不這麼認爲。我解釋了爲什麼我想避免使用適配器/包裝器模式,並且我也沒有看到使用@的Python包裝技術在這裏可以如何幫助。也許2分鐘不足以完全理解我的帖子? ;-) – Michael
帶有@的東西被稱爲裝飾器,而不是包裝器。如果你沒有使用包裝器,那麼答案是:不,Python不提供任何內置/標準函數/語法來執行你想要的操作 –