Dans le code suivant, je crée une classe abstraite de base Base
. Je veux que toutes les classes qui héritent de Base
pour fournir le name
J'ai donc fait de cette propriété un @abstractmethod
.
J'ai ensuite créé une sous-classe de Base
appelé Base_1
qui est censé fournir certaines fonctionnalités, tout en restant abstrait. Il n'y a pas de name
propriété en Base_1
mais python instaure néanmoins un objet de cette classe sans erreur. Comment créer des propriétés abstraites ?
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")