2016-04-03 18 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(...)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 

  1. EdgeのサブタイプとしてFriendshipRoadを定義し、機能connectsNodesを提供する:「を求めメートル。あなたがそれらのクラスを変更できない、または変更したくない場合は、悪いです。
  2. FriendshipおよびRoadからEdgeに適合するアダプタクラスを作成します。このような「エイリアシング」技術をさまざまなケースで使用したい場合は面倒です。
  3. それぞれのメソッドに "リダイレクト"する関数呼び出し時にラムダ関数を定義します。 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)) 
関連する問題