["python","properties","abstract-class","decorator","abstract-methods"]
How to create abstract properties in python abstract classes?

In the following code, I create a base abstract class Base. I want all the classes that inherit from Base to provide the name property, so I made this property an @abstractmethod. Then I created a subclass of Base, called Base_1, which is meant to supply some functionality, but still remain abstract. There is no name property in Base_1, but nevertheless python instatinates an object of that class without an error. How does one create abstract properties? from abc import ABCMeta, abstractmethod class Base(object): # class Base(metaclass = ABCMeta): <- Python 3 __metaclass__ = ABCMeta def __init__(self, str_dir_config): self.str_dir_config = str_dir_config @abstractmethod def _do_stuff(self, signals): pass @property @abstractmethod def name(self): """This property will be supplied by the inheriting classes individually. """ pass class Base1(Base): __metaclass__ = ABCMeta """This class does not provide the name property and should raise an error. """ def __init__(self, str_dir_config): super(Base1, self).__init__(str_dir_config) # super().__init__(str_dir_config) <- Python 3 def _do_stuff(self, signals): print "Base_1 does stuff" # print("Base_1 does stuff") <- Python 3 class C(Base1): @property def name(self): return "class C" if __name__ == "__main__": b1 = Base1("abc")
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 ABCMeta, abstractproperty class C: __metaclass__ = ABCMeta @abstractproperty def my_abstract_property(self): ...