Jython 2.1 __getattr__
Pregunta
Estoy tratando de implementar una clase de contenedor / proxy para un objeto de Java (baseClient) en v2.1 jython. Todo parece estar funcionando bien, excepto cuando se encuentra la siguiente declaración:
if __client != None # __client is an instance of the ClientProxy class
raise AttributeError(attr)
se llama en __getattr__()
, porque self.__baseClient
no tiene atributo __ne__
.
Es importante mencionar que no se puede actualizar porque jython es una parte de un sistema. ¿Hay una manera de solucionar este 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
Muchas gracias!
Solución
if __client != None:
Para las pruebas contra casos específicos, tales como Ninguno, es idiomática utilizar el operador identidad:
if __client is not None:
Esto evitará el problema de llamar a los comparadores.
Sin embargo, el hecho de que __getattr__
plantea AttributeError
no debería ser un problema. El comparador debe llamar getattr
especulativamente para __cmp__
(__ne__
primero en los nuevos pitones), y si se pone un AttributeError
se supone que tragar en silencio y caer de nuevo a la comparación de identidad en su lugar. ¿Por qué la AttributeError
causar un problema en su caso?