J'ai passé beaucoup de temps à faire des recherches sur ce sujet, mais aucune des réponses ne semble fonctionner comme je le souhaiterais.Comment créer un attribut de classe abstraite (potentiellement en lecture seule)
J'ai une classe abstraite avec un attribut de classe que je veux chaque sous-classe d'être forcé à mettre en œuvre
class AbstractFoo():
forceThis = 0
Alors que quand je fais
class RealFoo(AbstractFoo):
pass
il renvoie une erreur me disant qu'il peut Ne créez pas la classe avant d'implémenter forceThis
.
Comment puis-je faire cela?
(je ne veux pas l'attribut à lecture seule, mais si c'est la seule solution, je vais l'accepter.)
Pour une méthode de classe, je l'ai découvert que je peux faire
from abc import ABCMeta, abstractmethod
class AbstractFoo(metaclass=ABCMeta):
@classmethod
@abstractmethod
def forceThis():
"""This must be implemented"""
de sorte que
class RealFoo(AbstractFoo):
pass
au moins jette l'erreur TypeError: Can't instantiate abstract class EZ with abstract methods forceThis
(Bien que cela ne force pas forceThis
à être une méthode de classe.)
Comment puis-je obtenir une erreur similaire à apparaître pour l'attribut de classe?
Vous pouvez utiliser 'abstractproperty', également à partir du module abc. Notez que cela nécessite que l'attribut soit une propriété, pour des raisons discutées un peu [ici] (http://stackoverflow.com/questions/23831510/python-abstract-attribute-not-property). – BrenBarn
[this] (http://stackoverflow.com/a/32536493/5049813) que j'ai trouvé dans votre lien @BrenBarn est très proche de ce que je veux, mais l'erreur ne se présente que lorsque vous essayez d'accéder à la propriété, pas quand la classe est définie. –
Il apparaîtra si vous essayez d'instancier la classe. Avez-vous vraiment besoin que cela se produise lorsque vous définissez la classe? Si oui, vous pourriez faire quelque chose dans le sens suggéré [ici] (http://stackoverflow.com/questions/30876344/can-i-prevent-class-definition-unless-a-method-is-implemented). – BrenBarn