0

次のコードでは、Graph()はVertexとEdgeのプロキシとして機能しています。クライアントはGraph()を介してのみVertexとEdgeにアクセスします。

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がリソースオブジェクトにアクセスするための最良の方法は何ですか?

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

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

4

1 に答える 1

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__できないことは何をしますか?

于 2011-06-28T04:48:05.950 に答える