Расширение встроенных классов SWIG - PullRequest
6 голосов
/ 24 июня 2011

Опция -builtin в SWIG имеет преимущество в том, что она быстрее и освобождается от ошибки с множественным наследованием.
Сбой в том, что я не могу установить какой-либо атрибут для сгенерированных классов или любого подкласса:
-Я могу расширить встроенный тип Python, например, список, без хлопот, путем его подкласса:

class Thing(list):
    pass

Thing.myattr = 'anything' # No problem

- Однако, используя тот же подход для встроенного типа SWIG, происходит следующее:

class Thing(SWIGBuiltinClass):
    pass

Thing.myattr = 'anything'

AttributeError: type object 'Thing' has no attribute 'myattr'

Как я мог обойти эту проблему?

1 Ответ

4 голосов
/ 25 июня 2011

Я нашел решение совершенно случайно.Я экспериментировал с метаклассами, думая, что мне удастся переопределить функции setattr и getattr встроенного типа в подклассе.

Делая это, я обнаружил встроенные функции ужеУ меня есть метакласс (SwigPyObjectType), поэтому мой метакласс должен был его наследовать.

И это все.Это само по себе решило проблему.Я был бы рад, если бы кто-то мог объяснить, почему:

SwigPyObjectType = type(SWIGBuiltinClass)

class Meta(SwigPyObjectType):
    pass

class Thing(SWIGBuiltinClass):
    __metaclass__ = Meta

Thing.myattr = 'anything' # Works fine this time
...