8

を使用して仮想属性を実装するクラスがあります__getattr__。属性は、クエリの実行など、コストがかかる場合があります。現在、オブジェクトが実際に属性を取得する前に属性を持っているかどうかをチェックするライブラリを使用しています。

その結果、クエリは 1 回ではなく 2 回実行されます。もちろん__getattr__、属性が存在するかどうかを実際に知るために実際に実行することは理にかなっています。

class C(object):
    def __getattr__(self, name):
        print "I was accessed"
        return 'ok'

c = C()
hasattr(c, 'hello')

これを防ぐ方法はありますか?

Python がサポートさ__hasattr__れている場合、クエリが存在するかどうかを確認するだけで済み、実際に実行することはできません。

キャッシュを作成できますが、クエリにパラメーターが含まれている可能性があるため、重いです。もちろん、サーバーはクエリ自体をキャッシュして問題を最小限に抑えることができますが、クエリが大量のデータを返す場合は依然として負荷が高くなります。

何か案は?

4

2 に答える 2

0

これは一般的におそらく悪いパターンだと思いますが、オブジェクトの基になる__dict__.

In [1]: class A(object):
   ....:     @property
   ....:     def wha(self):
   ....:         print "was accessed"
   ....:

In [2]: A.__dict__
Out[2]:
<dictproxy {'__dict__': <attribute '__dict__' of 'A' objects>,
'__doc__': None,
'__module__': '__main__',
'__weakref__': <attribute '__weakref__' of 'A' objects>,
'wha': <property at 0x10f6b11b0>}>

In [3]: a = A()

In [4]: "wha" in a.__class__.__dict__
Out[4]: True
于 2015-05-17T18:22:38.773 に答える