Jythonの2.1 __getattr__
質問
私はのJython v2.1のJavaオブジェクト(baseClient)のラッパー/プロキシクラスを実装しようとしています。すべては次のステートメントに遭遇した場合を除き、[OK]を動作しているようだ。
if __client != None # __client is an instance of the ClientProxy class
raise AttributeError(attr)
は__getattr__()
属性を持っていないため、 self.__baseClient
は、__ne__
で呼ばれています。
これは、Jythonのは、システムの一部であるので、私はアップグレードすることはできませんことを言及することが重要です。この問題を回避する方法はありますか?
class ClientProxy:
def __init__(self, baseClient):
self.__baseClient = baseClient
self.__initialised = 1
def __getattr__(self, attr):
if not self.__dict__.has_key('_ClientProxy__initialised'):
raise AttributeError(attr)
else:
if hasattr(self.__baseClient, attr):
return getattr(self.__baseClient, attr)
else:
raise AttributeError(attr)
def __setattr__(self, attr, val):
if not self.__dict__.has_key('_ClientProxy__initialised'):
self.__dict__[attr] = val
return
if hasattr(self.__baseClient, attr):
self.__baseClient.__setattr__(attr, val)
else:
self.__dict__[attr] = val
どうもありがとうございました!
解決
if __client != None:
などなしなどの特定のインスタンスに対するテストのために、それは、アイデンティティ演算子を使用する慣用です
if __client is not None:
このは、コンパレータの呼び出しの問題を回避します。
しかし、__getattr__
はAttributeError
を上げるということは問題になることはありません。コンパレータは、(新しいニシキヘビの最初のgetattr
)__cmp__
のために投機的__ne__
呼び出す必要があり、それがAttributeError
を取得する場合、黙ってそれを飲み込むし、代わりに同一性比較にフォールバックすることになっています。なぜAttributeError
はあなたのケースで問題になるのでしょうか?
所属していません StackOverflow