Jython 2.1 __getattr__
Question
Je suis en train de mettre en œuvre une classe wrapper / proxy pour un objet java (baseClient) dans Jython v2.1. Tout semble fonctionner ok sauf si l'instruction suivante est rencontrée:
if __client != None # __client is an instance of the ClientProxy class
raise AttributeError(attr)
est appelé à __getattr__()
, parce que self.__baseClient
n'a pas attribut __ne__
.
Il est important de mentionner que je ne peux pas mettre à niveau parce que Jython est une partie d'un système. Y at-il un moyen de contourner ce problème?
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
Merci beaucoup!
La solution
if __client != None:
Pour les tests contre des cas spécifiques tels que Aucun, il est idiomatiques d'utiliser l'opérateur d'identité:
if __client is not None:
Cela évitera le problème d'appeler des comparateurs.
Cependant, le fait que __getattr__
soulève AttributeError
ne devrait pas être un problème. Le comparateur doit appeler getattr
spéculativement pour __cmp__
(__ne__
d'abord sur Pythons nouveaux), et si elle obtient un AttributeError
il est censé avaler en silence et revenir à la comparaison d'identité au lieu. Pourquoi la AttributeError
provoque un problème dans votre cas?