Jython 2.1 __getattr__

时间:2009-11-17 17:20:03

标签: python jython wrapping setattr getattr

我正在尝试在jython v2.1中为java对象(baseClient)实现一个包装器/代理类。除非遇到以下语句,否则一切似乎都正常工作:

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 :(得分:0)

if __client != None:

对于特定实例(如None)的测试,使用身份运算符是惯用的:

if __client is not None:

这将避免调用比较器的问题。

但是,__getattr__引发AttributeError这一事实应该不成问题。比较器应推测getattr推测__cmp____ne__首先在新的Pythons上),如果得到AttributeError,它应该默默地吞下它并回归到身份比较而不是。为什么AttributeError导致您的案件出现问题?