我按如下方式实现元类:
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
@property,它可以用来引用它自己。)
请注意,我不想instantiate the meta class。我只是希望它的子节点的实例具有.name
@property而不必为每个显式写出代码。