我有一个在SWIG中从C ++导出到Python的类。一切正常。现在我想定义 getattribute 来处理对C ++代码中内置的脚本语言定义的变量和函数的虚拟化访问。但是,当我使用%pythoncode定义 getattribute 函数时,它无法按预期工作。如果我找不到我应该引发的变量或函数,那么异常称为AttributeError。然而,SWIG函数 getattr 会对此产生影响。
%pythoncode %{
def __getattribute__(self, attribute):
raise AttributeError(attribute)
%}
现在如果我这样做就可以了:
%pythoncode %{
def __getattribute__(self, attribute):
return object.__getattribute__(self, attribute)
%}
因此,当我引发AttributeError时,SWIG生成的 getattr 的行为无法正常工作,就像我应该在找不到属性时那样。因此,出于我的目的,我将使用第二个示例并在例程之前插入我自己的代码,以确定是否存在虚拟化函数。如果不是,我将让默认对象getattribute函数处理它。
有没有更好的方法来解决这个问题?
现在我看到这个我发现它在常规Python 2.7中也不起作用:
class testmethods(object):
def __init__(self):
self.nofunc1 = None
self.nofunc2 = "nofunc2"
def func1(self):
print "func1"
def func2(self):
print "func2"
def __getattribute__(self, attribute):
print "Attribute:",attribute
raise AttributeError(attribute)
这会引发异常,但不会将责任转换为“ getattr ”功能。那么一个人应该如何应对呢?
好的,罢工。如果getattr存在于提升异常的对象中,则确实有效。因此,swig行为不正确。
答案 0 :(得分:0)
现在,我想我想出了这个:
def __getattribute__(self, attribute):
try:
defattrib = object.__getattribute__(self, attribute)
except AttributeError,e:
defattrib = None
if defattrib is not None:
return defattrib
# find attributes in user defined functions
...
# if an attribute cannot be found
raise AttributeError(attribute)
这似乎工作正常。 swig getattr似乎正确处理异常。所以只是我的代码无效。