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 la name
propriété, j'ai donc fait de cette propriété un @abstractmethod
.
Ensuite, j'ai créé une sous-classe de Base
, appelée Base_1
, qui est censée fournir des fonctionnalités, mais reste abstraite. Il n'y a pas de name
propriété dans Base_1
, mais néanmoins python instaure un objet de cette classe sans erreur. Comment créer des propriétés abstraites?
from abc import ABCMeta, abstractmethod
class Base(object):
__metaclass__ = ABCMeta
def __init__(self, strDirConfig):
self.strDirConfig = strDirConfig
@abstractmethod
def _doStuff(self, signals):
pass
@property
@abstractmethod
def name(self):
#this property will be supplied by the inheriting classes
#individually
pass
class Base_1(Base):
__metaclass__ = ABCMeta
# this class does not provide the name property, should raise an error
def __init__(self, strDirConfig):
super(Base_1, self).__init__(strDirConfig)
def _doStuff(self, signals):
print 'Base_1 does stuff'
class C(Base_1):
@property
def name(self):
return 'class C'
if __name__ == '__main__':
b1 = Base_1('abc')
python
properties
abstract-class
decorator
Boris Gorelik
la source
la source
@property
dansclass C
,name
reviendra à une méthode.Réponses:
Depuis Python 3.3, un bogue a été corrigé, ce qui signifie que le
property()
décorateur est maintenant correctement identifié comme abstrait lorsqu'il est appliqué à une méthode abstraite.Remarque: la commande compte, vous devez utiliser
@property
avant@abstractmethod
Python 3.3+: ( documentation python ):
Python 2: ( documentation python )
la source
Jusqu'à Python 3.3 , vous ne pouvez pas imbriquer
@abstractmethod
et@property
.Utilisez
@abstractproperty
pour créer des propriétés abstraites ( docs ).Le code lève maintenant l'exception correcte:
la source
@abstractproperty
est déconseillée au profit d'une combinaison comme OP.raise NotImplementedError
Basé sur la réponse de James ci-dessus
et utilisez-le comme décorateur
la source