0

、グラフ()頂点へのプロキシとエッジとして機能している - クライアントは、(頂点にアクセスして、グラフを通るエッジが):Pythonでプロキシパターンを使用する場合、プロキシクラスはどのように呼び出しオブジェクトの状態にアクセスできますか?次のコードで

from rest import Resource 
from elements import Vertex, Edge 

class Graph(object): 
    def __init__(self,db_url): 
     self.resource = Resource(db_url) 
     self.vertices = Vertex 
     self.edges = Edge 

g1 = Graph('http://localhost/one') 
g2 = Graph('http://localhost/two') 

アクセスに頂点と辺のための最善の方法は何ですかVertexとEdgeのパラメータとして渡す必要はありませんか?

VertexとEdgeにはリソースオブジェクトへのアクセスが必要なcreate()などのclassmethodがあるため、パラメータとして渡したくない理由の1つです。

Flask/Werkzeugは "コンテキストローカル"(http://werkzeug.pocoo.org/docs/local/)を使用しています - これは正しいアプローチですか、それとも良い方法ですか?

+0

代理人は別の参照を意味しますか? –

+0

この場合、グラフ()はVertexとEdgeへのプロキシとして機能します。 – espeed

+1

Pythonのファンは、インタプリタ自体が依存性注入フレームワークであるということを無視する傾向がありますが(「クラスの名前を動的に変更することができるため」、プロキシオブジェクトの使用をやめて「Dependency Injection」を読むことをお勧めします)あなたの状況に合わせて) – Arafangion

答えて

1

リソースオブジェクトが一意の場合は、シングルトンにすることはできますか?あなたがクラスメソッドからそれを使いたいという事実は、おそらくそれが事実だと私に思います。その唯一の目的がデータベース接続を提供することであれば、接続プールの使用を検討できますか?

まだクラスに渡す必要がある場合は、単にクラス属性に割り当てることができます。

class Vertex(object): 
    @classmethod 
    def foo(cls): 
     print cls.resource 

Vertex.resource = 'something' 
v = Vertex() 
v.foo() 

これは__init__でもを行うことができます。

class Vertex(object): 

    def __init__(self, resource): 
     if not hasattr(self.__class__, 'resource'): 
      self.__class__.resource = resource 

    @classmethod 
    def foo(cls): 
     print cls.resource 

resource = 'some resource' 
v = Vertex(resource) 
v.foo() 

しかし、本当に私の直感では、多くの場合、単にモジュールとしてPythonで実装することができシングルトンを使用してに見なければならないことです。

最後に、コードに関するいくつかの発言をすることができれば、クラスを複数の変数名に割り当てることが混乱していることがわかります。私がself.edgesを見ると、クラスではなく、コレクションやイテレートが期待されます。私はまた、あなたがcreateと呼ばれるクラスメソッドを望んでいるのだろうと思っています。 __init__はどうしますか?

+0

こんにちはアレックス - フィードバックありがとうございます。 VertexクラスとEdgeクラスは、graph.vertices.get_all()やgraph.edges.get(edge_id)など、グラフDBとやりとりするためのインターフェイスを提供します。graph.vertex.get_all()に名前を変更することをお勧めしますか? 、など? db_urlは、リソースオブジェクトの作成時にパラメータとして渡され、グラフAPIは、グラフオブジェクトの作成時に別のDB URLを渡すことによって、複数のDBにアクセスする機能をユーザに提供します。モジュールをグローバルシングルトンとして使用する方法を検討しましたが、URLが異なる2つのグラフオブジェクトを作成する際に問題がありました。 – espeed

+1

OK問題は、クラスをオブジェクトのように動作させようとしていることだと思います。データに応じて動的に動作を変更するクラスを作成しようとしています。それは本当にオブジェクトがあるものです。コンテナクラスを導入して頂点とエッジを管理することをお勧めします。 –

+0

ところで、Arafangionが提案したように、ここで代理をしているわけではありません。代理する予定のオブジェクトに直接アクセスできるからです。これを自信を持って確認するには、あなたの "プロキシされた"オブジェクト(プロキシの典型的な使用例)へのアクセスをログに記録するか、カウントするかを自分自身に尋ねます。 –

関連する問題