abc.abstractmethod + property
abc, properties, python
Solution
If you want `greet` to be a property, you still need to use the `@property` decorator in your implementation:
class Foo(FooBase):
@property
def greet(self):
return 'hello'
All that an ABC metaclass does is test wether or not you have provided the same name in the concrete class; it doesn't care if it is a method or a property or a regular attribute.
Because it doesn't care, it doesn't magically apply `property` decorators either. This is a good thing; perhaps in a specific implementation a static attribute is enough to satisfy the requirement, and a property would be overkill.
The purpose of a ABC metaclass is to help you detect gaps in your implementation; it never was intended to enforce the types of the attributes.
Note that before Python 3.3 you can not combine a `@property` with an `@abstractmethod`. You would have to use an `@abstractproperty` decorator instead. There is an ambiguity there when your property needs more than a simple getter in that case; Python 3.3 covers that case much better (see issue 11610 for the painful details).
Problem
According to the docs it should work to combine `@property` and `@abc.abstractmethod` so the following should work in python3.3: ``` import abc class FooBase(metaclass=abc.ABCMeta): @property @abc.abstractmethod def greet(self): """ must be implemented in order to instantiate """ pass @property def greet_comparison(self): """ must be implemented in order to instantiate """ return 'hello' class Foo(FooBase): def greet(self): return 'hello' ``` test the implementation: ``` In [6]: foo = Foo() In [7]: foo.greet Out[7]: <bound method Foo.greet of <__main__.Foo object at 0x7f935a971f10>> In [8]: foo.greet() Out[8]: 'hello' ``` so it is obviously not a property, because then it should work like that: ``` In [9]: foo.greet_comparison Out[9]: 'hello' ``` Maybe I'm to stupid or it simply doesn't work, somebody has an idea?