Я реализую метакласс следующим образом:
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 без необходимости явно писать код для каждого из них.
name
— это свойство, аmagic
— это метод? - person quamrana   schedule 30.12.2017