私はPythonでクラスを持っていますが、これはサーバーへのリモート接続を実行します。状況(パフォーマンスの問題など)に応じて使用できる同じデータにアクセスするためのいくつかのプロトコル(TCP/IP、HTTP)があるので、クラスをカプセル化するさまざまな機能のデコレータとして使用したいと思います実装。クラスとアクセスクラスインスタンスを持つPythonデコレート関数
私のクラスには、次のようになります。
class RemoteConnection(object):
def __init__(self, function):
self.function = function
self.results = None
def __call__(self, *args):
self.function(self, *args)
def setResults(*args):
self.results = args
@RemoteConnection
def performTCPConnection(instance, username, password):
#...perform connection
instance.setResults(results) #set the results of the connection (a query)
return instance
@RemoteConnection
def performHTTPConnection(instance, username, password):
#...perform connection
#and so on
if __name__ == '__main__':
performTCPConnection("admin", "admin") #OR
#performHTTPConnection("admin, "admin")
パラメータ(ユーザ名とパスワードよりも、これらは参考用のみです)後でまたは何か他のものを使用してプログラムの開発に与えられなければなりません。
私がこのようなプログラムを呼び出すと、__init__()
メソッドがデコレータのために2回呼び出されます。また、performTCPConnection
-functionが呼び出され、__call__
-methodが呼び出される前に呼び出されます。私が今したいのは、RemoteConnectionクラスのインスタンスが、performTCPConnection
関数によってメイン関数の変数に返されるということです。
私は次のような何か場合:
foo = perfprmTCPConnection("admin","admin")
print foo
なしが標準出力に出力されませんが。
私はそのようなperformTCPConnection機能でインスタンスにアクセスしようとした場合:
@RemoteConnection
def performTCPConnection(instance, username, password):
#...perform connection
instance.setResults(results) #set the results of the connection (a query)
print instance
return instance
<__main__.ServerConnection object at 0x7f4803516fd0>
のようなものがSTDOUTに書き込まれます。
私の考えは、Strategy-Patternの実装のように、Javaの世界から少し動いています。
残念ながら、私は今まで説明された動作の良い説明は見つかりませんでした。これは良い設計アプローチですか?
アドバイスをいただきありがとうございます、これは現時点ではより良いアプローチかもしれません。また、自分の答えで述べたように私の最初のアプローチで間違いを見つけました。 – Supahupe
また、@alexisの解決法は、実際に私が提案したより簡単なアプローチです。それは、あなたが本当にやっていることを明確にして、それをさらに明らかにするでしょう。当然のことながら、最適なソリューションは、アプリケーションのコンテキストと、実際にそのアプリケーションを使用する方法と、どのような柔軟性を活用する必要があるのかによっても異なります。 – zmo