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!

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top