У меня есть класс, который экспортируется из C ++ в Python в SWIG. Все отлично работает Теперь я хочу определить getattribute для обработки виртуализированного доступа к переменным и функциям, которые определены на языке сценариев, встроенном в код C ++. Однако когда я определяю функцию getattribute с использованием% pythoncode, она не работает должным образом. Если я не могу найти переменные или функции, я должен вызвать и исключение под названием AttributeError. Однако функция SWIG getattr подавляется этим.
%pythoncode %{
def __getattribute__(self, attribute):
raise AttributeError(attribute)
%}
Теперь, если я сделаю это, все в порядке:
%pythoncode %{
def __getattribute__(self, attribute):
return object.__getattribute__(self, attribute)
%}
Итак, поведение генерируемого SWIG getattr не работает должным образом, когда я вызываю AttributeError, как я должен делать, когда атрибут и не найден. Поэтому для своих целей я буду использовать второй пример и вставлять свой собственный код перед процедурой, чтобы определить, существует ли виртуализированная функция. Если нет, я позволю функции 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, исключение работает. Так что поведение глотка не правильное.