Python: неабстрактные методы в абстрактном базовом классе

Я реализую метакласс следующим образом:

from abc import ABCMeta

class Algorithm(metaclass=ABCMeta):
    # lots of @abstractmethods

    # Non-abstract method
    @property
    def name(self):
        ''' Name of the algorithm '''
        return self.__class__.__name__

class MyLittleAlgorithm(Algorithm):        
    def magic(self):
        return self.name

Затем у меня сложилось впечатление, что следующие два отпечатка должны давать одинаковый результат.

a = MyLittleAlgorithm()
print(a.magic)
print(a.name)

но на самом деле я получаю:

>>> print(a.magic)
<bound method MyLittleAlgorithm.magic of <__main__.MyLittleAlgorithm object at 0x11242f438>>
>>> print(a.name)
MyLittleAlgorithm

Поведение, которое мне нужно, - последнее. (Я хочу, чтобы каждый алгоритм, наследуемый от Algorithm, имел свойство .name @, которое он мог бы использовать для ссылки на самого себя.)

Обратите внимание, что я не хочу создавать экземпляр метакласса. Я просто хочу, чтобы экземпляры его дочерних элементов имели .name @property без необходимости явно писать код для каждого из них.


person MarcinKonowalczyk    schedule 30.12.2017    source источник
comment
Это потому, что name — это свойство, а magic — это метод?   -  person quamrana    schedule 30.12.2017
comment
@quamrana, ага. Правильно ‹facepalm›. Вас всегда заводят простые вещи...   -  person MarcinKonowalczyk    schedule 30.12.2017
comment
Приношу свои извинения за потенциально устаревший вопрос. Я позволю администраторам решать, что с ним делать, но я рад, что его удалят.   -  person MarcinKonowalczyk    schedule 30.12.2017