How to create abstract properties in python abstract classes
How to create abstract properties in python abstract classes
Since Python 3.3 a bug was fixed meaning the property()
decorator is now correctly identified as abstract when applied to an abstract method.
Note: Order matters, you have to use @property
above @abstractmethod
Python 3.3+: (python docs):
from abc import ABC, abstractmethod
class C(ABC):
@property
@abstractmethod
def my_abstract_property(self):
...
Python 2: (python docs)
from abc import ABC, abstractproperty
class C(ABC):
@abstractproperty
def my_abstract_property(self):
...
Until Python 3.3, you cannot nest @abstractmethod
and @property
.
Use @abstractproperty
to create abstract properties (docs).
from abc import ABCMeta, abstractmethod, abstractproperty
class Base(object):
# ...
@abstractproperty
def name(self):
pass
The code now raises the correct exception:
Traceback (most recent call last): File foo.py, line 36, in b1 = Base_1(abc) TypeError: Cant instantiate abstract class Base_1 with abstract methods name
How to create abstract properties in python abstract classes
Based on James answer above
def compatibleabstractproperty(func):
if sys.version_info > (3, 3):
return property(abstractmethod(func))
else:
return abstractproperty(func)
and use it as a decorator
@compatibleabstractproperty
def env(self):
raise NotImplementedError()