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!

Était-ce utile?

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top