Когда использовать метод new.instance против метода, присваиваемого классу - PullRequest
3 голосов
/ 14 февраля 2012

В нашей кодовой базе есть Python и C ++, объединенные SWIG. Классы C ++ иногда получают расширения Python, например:

%pythoncode %{

def DiscreteKey_baseData(self, baseData):
    pass

def DiscreteKey_asSet(self):
    pass

DiscreteKey.baseData = new_instancemethod(DiscreteKey_baseData, None, DiscreteKey)
DiscreteKey.asSet = new_instancemethod(DiscreteKey_asSet, None, DiscreteKey)

%}

или

%pythoncode %{

def ParmID_hash(parmID):
    return hash(str(parmID))

ParmID.__hash__ = ParmID_hash

%}

В чем разница между использованием new.instancemethod для присоединения метода к классу и простым его назначением, как во втором примере? Можно ли изменить первый пример на просто

DiscreteKey.baseData = DiscreteKey_baseData
DiscreteKey.asSet = DiscreteKey_asSet

? (обратите внимание, что baseData принимает другой аргумент)

Или, во-вторых, в каком-то смысле действительно не хватает второго примера, и следует также использовать new_instancemethod?

1 Ответ

3 голосов
/ 14 февраля 2012

Присвоение функции атрибуту класса и выполнение этого с помощью new_instancemethod() (который я предполагаю, является псевдонимом Swig для конструктора метода, например, types.MethodType) в точности эквивалентны. Вы можете сказать, проверив type(DiscreteKey.baseData). Независимо от того, как был назначен метод, это будет <type 'instancemethod'>.

Конструктор new_instancemethod() полезен, однако, при назначении функций экземплярам. Это не будет работать без метода "обертка".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...