Forum Programmation.python Référencer un classe à l'intérieur de sa définition

Posté par (page perso) . Licence CC by-sa
Tags : aucun
1
29
juin
2017

Bonjour,
j'écris une API en python qui gère des widgets, par exemple des boutons divers et variés, et tout un tas de conteneurs (environ 80 types de composants différents). Il y a des règles qui définissent ce qu'un conteneur a le droit de contenir.
Les Widgets et les conteneurs sont représentés par des classes, comme ceci:

    class Bouton:
        pass

    class Glissiere:
        pass

    class Conteneur:
        hierarchy = {Bouton, Glissiere}

Cette partie là fonctionne.
Mon problème est que certain conteneurs peuvent se contenir eux-mêmes (pas tous). Si je reprends mon exemple précédent, je souhaiterais écrire :

    class Conteneur:
        hierarchy = {Bouton, Glissiere, Conteneur}

Et notre ami python de râler qu'il ne connaît pas la classe Conteneur qui est en train d'être définie. Y a t'il un quelconque artifice syntaxique qui permette de référencer une classe dans sa propre définition, ou suis-je condamné à sortir l'information hiérarchique hors des définitions des classes (par exemple avec un dictionnaire {Conteneur ⇒ {Bouton, Glissiere, Conteneur}, etc.}

  • # getattr

    Posté par . Évalué à 2.

    Salut,

    Passe le nom des class en string et ensuite tu les instancies avec getattr

    mon_obj = getattr(module, 'Conteneur')()

  • # Modifier la classe après sa création

    Posté par . Évalué à 2.

    Je pense que la solution la plus simple est de modifier la classe après sa création:

    class Conteneur:
            hierarchy = {Bouton, Glissiere}
    
    Conteneur.hierarchy.add(Conteneur)
  • # Constructeur

    Posté par (page perso) . Évalué à 2.

    Tu peux initialiser hierarchy dans le constructeur :

    >>> class Foo:
    ...     def __init__(self):
    ...         self.hierarchy = Foo
    ... 
    >>> x = Foo()
    >>> x.hierarchy
    <class __main__.Foo at 0x7fc30ea64328>

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.