Я хотел бы создать «свойство класса», которое объявлено в абстрактном базовом классе, а затем переопределено в конкретном классе реализации, сохраняя при этом прекрасное утверждение о том, что реализация должна переопределить свойство класса абстрактного базового класса.Как я могу объединить abc.abstractproperty с classmethod, чтобы создать свойство абстрактного класса?
Хотя я смотрел на this question мою наивную попытку повторного назначения принятый ответ не работает:
>>> import abc
>>> class ClassProperty(abc.abstractproperty):
... def __get__(self, cls, owner):
... return self.fget.__get__(None, owner)()
...
>>> class Base(object):
... __metaclass__ = abc.ABCMeta
... @ClassProperty
... def foo(cls):
... raise NotImplementedError
...
>>> class Impl(Base):
... @ClassProperty
... def foo(cls):
... return 5
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/2rs2ts/src/myproj/env/lib/python2.7/abc.py", line 94, in __new__
value = getattr(cls, name, None)
File "<stdin>", line 3, in __get__
TypeError: Error when calling the metaclass bases
unbound method foo() must be called with Impl instance as first argument (got nothing instead)
Я немного потерял от того, что я должен делать. Любая помощь?