Использование singledispatch с пользовательским классом (CPython 3.8.2) - PullRequest
0 голосов
/ 07 марта 2020

Допустим, я хочу установить функции для каждого класса в модуле с именем 'MacroMethods'. Поэтому я установил singledispatch, увидев его в «Fluent Python» следующим образом:

@singledispatch
def addMethod(self, obj):
    print(f'Wrong Object {str(obj)} supplied.')
    return obj

...

@addMethod.register(MacroMethods.Wait)
def _(self, obj):
    print('adding object wait')
    obj.delay = self.waitSpin.value
    obj.onFail = None
    obj.onSuccess = None
    return obj

Желаемое поведение - когда экземпляр класса 'MacroMethods.Wait' задан в качестве аргумента, singledispatch запускается зарегистрированным функция с этим типом класса.

Вместо этого она запускает функцию по умолчанию, а не зарегистрированную.

>>> Wrong Object <MacroMethods.Wait object at 0x0936D1A8> supplied.

Однако type () ясно показывает, что экземпляр является классом 'MacroMethods.Wait' и dict_keys свойство также содержит его.

>>> dict_keys([<class 'object'>, ..., <class 'MacroMethods.Wait'>])

Я подозреваю, что все пользовательские классы, которые я сделал, считаются типом 'object' и в результате не выполняют требуемые функции.

Есть ли способ решить эту проблему? Полные коды здесь .

...