2015-01-16 4 views
8

Я хотел бы создать «свойство класса», которое объявлено в абстрактном базовом классе, а затем переопределено в конкретном классе реализации, сохраняя при этом прекрасное утверждение о том, что реализация должна переопределить свойство класса абстрактного базового класса.Как я могу объединить 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) 

Я немного потерял от того, что я должен делать. Любая помощь?

ответ

3

Вам необходимо использовать это в дополнение к декоратору @classmethod.

class Impl(Base): 
    @ClassProperty 
    @classmethod 
    def foo(cls): 
     return 5 

In [11]: Impl.foo 
Out[11]: 5 

 Смежные вопросы

  • Нет связанных вопросов^_^