Jython 2.1 __getattr__ - PullRequest
       13

Jython 2.1 __getattr__

0 голосов
/ 17 ноября 2009

Я пытаюсь реализовать класс оболочки / прокси для java-объекта (baseClient) в jython v2.1. Кажется, все работает нормально, кроме случаев, когда встречается следующее утверждение:

if __client != None # __client is an instance of the ClientProxy class

raise AttributeError(attr) вызывается в __getattr__(), потому что self.__baseClient не имеет атрибута __ne__. Важно отметить, что я не могу обновить, потому что Jython является частью системы. Есть ли способ обойти эту проблему?

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

Большое спасибо!

1 Ответ

0 голосов
/ 17 ноября 2009
if __client != None:

Для тестирования на конкретных экземплярах, таких как None, идиоматично использовать оператор идентификации:

if __client is not None:

Это позволит избежать проблемы вызова компараторов.

Однако тот факт, что __getattr__ поднимает AttributeError, не должен быть проблемой. Компаратор должен вызвать getattr спекулятивно для __cmp__ (__ne__ сначала для более новых Питонов), и если он получает AttributeError, он должен молча проглотить его и вместо этого вернуться к сравнению идентичности. Почему AttributeError вызывает проблемы в вашем случае?

...