9
votes

Une classe peut-elle contenir une instance d'elle-même comme conteneur de données?

Une classe Python peut contenir une instance d'elle-même comme un conteneur de données peut ressembler à ceci? XXX

Mon objectif est d'utiliser cette classe sous forme de conteneur de données contenant une copie à l'intérieur. être inité pour réduire l'action de plus enculé. Il est peut-être utilisé comme une chaîne "Annuler" donner une chance d'obtenir la valeur de l'init Val quand il est nécessaire.

est-il possible pour une telle action?


0 commentaires

3 Réponses :


1
votes

Eh bien, la classe que vous avez dans Self.A a aussi Self.A, et tellement furher sans fin. Je ne suis pas sûr d'avoir le but de ce que vous faites, mais vous pourriez essayer quelque chose comme ceci:

class A:
    def __init__(self, val, copy = True):
        if copy:
            self.a = A(val, False)
        self.val = val


0 commentaires

8
votes

Cela ne fonctionnera pas, pour la raison déjà donnée:

  1. python voit a (2) et appelle a .__ init __ . .
  2. a .__ init __ appels a (val) .
  3. a (val) appels a .__ init __ .
  4. goto 2

    Je suppose que vous faites cela pour que vous ayez un journal de ce que val a été; C'est-à-dire que si vous décidez un jour plus tard, vous décidez que vous voulez val 3 , vous ne jetez pas la valeur d'origine 2 . Du:

    code xxx

    explication
    • A (objet) : les classes doivent maintenant hériter de objet . Juste parce que, fondamentalement.
    • @Property : Cela dit à Python que chaque fois que nous demandons à A.Val, cela devrait appeler a.val () et renvoyer le résultat. Ceci est un décorateur ; Recherchez la fonction Propriété BusganeIn pour plus d'informations.
    • @ val.setter : Ceci est similaire à ce qui précède, mais indique à Python que chaque fois que nous essayons d'assigner à a.val , il doit appeler la fonction suivante. . Au lieu de définir a.val , il ajoute la valeur à la liste d'historique.


2 commentaires

Si je copie et collez cela exactement dans ipython (avec 2.7.5), alors self.history = [] jette un noméror parce que moi n'est pas encore défini. Tout conseil à faire dans ce cas? Cela semble résoudre mes problèmes, mais je ne peux pas le faire fonctionner.


Oui, bon point, c'est évidemment faux. Historique doit être défini dans la méthode __ init __ au lieu de la classe.



6
votes

Oui, une classe peut contenir une instance de soi, vous ne pouvez tout simplement pas le créer sur l'initiation pour les raisons décrites par d'autres.

Par exemple, cette classe le fera, P>

>>>OuterInstance.innerInstance.value
456


0 commentaires