156 votes

Constantes de classe en python

En python, je veux qu'une classe ait des "constantes" (pratiquement des variables) qui seront communes dans toutes les sous-classes. Y a-t-il un moyen de le faire avec une syntaxe amicale ? En ce moment j'utilise :

class Animal:
    SIZES=["Huge","Big","Medium","Small"]

class Horse(Animal):
    def printSize(self):
        print(Animal.SIZES[1])

et je me demande s'il y a une meilleure façon de le faire ou une façon de le faire sans avoir à écrire "Animal" avant les tailles. Cheval hérité de Animal.

25voto

larsmans Points 167484

Vous pouvez accéder à SIZES au moyen de self.SIZES (dans une méthode d'instance) ou cls.SIZES (dans une méthode de classe).

Dans tous les cas, vous devrez être explicite sur l'endroit où trouver SIZES. Une alternative est de mettre SIZES dans le module contenant les classes, mais ensuite vous devez définir toutes les classes dans un seul module.

15voto

phaedrus Points 8060
class Animal:
    HUGE = "Huge"
    BIG = "Big"

class Horse:
    def printSize(self):
        print(Animal.HUGE)

4voto

Matthew Trevor Points 5277

En développant la réponse de betabandido, vous pouvez écrire une fonction pour injecter les attributs en tant que constantes dans le module :

def module_register_class_constants(klass, attr_prefix):
    globals().update(
        (name, getattr(klass, name)) for name in dir(klass) if name.startswith(attr_prefix)
    )

class Animal(object):
    SIZE_HUGE = "Huge"
    SIZE_BIG = "Big"

module_register_class_constants(Animal, "SIZE_")

class Horse(Animal):
    def printSize(self):
        print SIZE_BIG

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X