グラフ処理機能があります。これは、クラス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
- が
Edge
のサブタイプとしてFriendship
とRoad
を定義し、機能connectsNodes
を提供する:「を求めメートル。あなたがそれらのクラスを変更できない、または変更したくない場合は、悪いです。 Friendship
およびRoad
からEdge
に適合するアダプタクラスを作成します。このような「エイリアシング」技術をさまざまなケースで使用したい場合は面倒です。- それぞれのメソッドに "リダイレクト"する関数呼び出し時にラムダ関数を定義します。
my_graph_algo(...)
を変更する必要があります。
既存のクラス/機能の変更を必要とせず、追加のクラスの導入を必要としないソリューションはありますか?代わりに名前の変更/エイリアスを提供するもの。
さらに、引数edge
が実際にエッジを表すオブジェクトのリストになるのはどうでしょうか?
質問は実用的であるだけでなく、少しだけ学問的です。
、私はそうは思いません –
ラッパーをしたいです。私はなぜアダプタ/ラッパーのパターンを避けたいのかを説明しました。また、Pythonラッパーのテクニックが@を使ってどのように役立つのか分かりません。たぶん2分で私の投稿を完全に理解するのに十分ではなかったでしょうか? ;-) – Michael
'@'のものはラッパーではなくデコレータと呼ばれます。あなたがラッパーを持っていないなら、答えは:いいえ、Pythonはあなたが望むことをするための組み込み関数/標準関数/構文を提供しません。 –