Jython 2.1 __getattr__
Domanda
Sto cercando di implementare una classe wrapper / proxy per un oggetto Java (baseClient) in Jython v2.1. Tutto sembra funzionare bene, tranne quando si incontra la seguente dichiarazione:
if __client != None # __client is an instance of the ClientProxy class
raise AttributeError(attr)
viene chiamato in __getattr__()
, perché self.__baseClient
non ha attributi __ne__
.
E 'importante ricordare che non possono effettuare l'aggiornamento a causa Jython è una parte di un sistema. C'è un modo per aggirare questo problema?
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
Grazie mille!
Soluzione
if __client != None:
Per il test contro casi specifici come None, è idiomatica utilizzare l'operatore identità:
if __client is not None:
Ciò eviterà il problema di chiamare comparatori.
Tuttavia, il fatto che __getattr__
solleva AttributeError
non dovrebbe essere un problema. Il comparatore dovrebbe chiamare getattr
speculativamente per __cmp__
(__ne__
prima a recenti Pythons), e se si ottiene un AttributeError
si suppone di ingoiare in silenzio e ricadere a confronto l'identità invece. Perché il AttributeError
causa un problema nel vostro caso?