2015-08-02 2 views
0

Comment puis-je accéder à une instance de classe avec son nom stocké en tant que chaîne.python: instance de classe d'appel par variable

Par exemple: j'ai une classe: Feets et deux instances de Feets: RF et LF

dans les deux cas, j'ai besoin d'une valeur de l'autre instance. Chaque instance connaît le nom de l'autre (par exemple LF.opposite = "RF") qui est engagé comme argument lors de la création de l'instance (par exemple, LF = Feets (x, x, x, "RF") Je sais encore l'getattr (objet, nom) n'accepte pas une chaîne comme objet.

Je vous remercie d'avance pour votre aide!

+0

Pourquoi ne transmettez-vous pas l'instance au lieu du nom de la variable? 'LF = Pieds (x, x, x, RF)' – falsetru

+0

Les deux instances sont créées séparément. RF = Pieds (x, x, x, LF) Je suppose que je ne peux pas passer RF à LF alors que RF n'est pas déjà créé – user2488

+1

Que diriez-vous de définir l'attribut 'opposite' pour le premier objet plus tard? 'LF = Pieds (x, x, x, aucun); RF = Pieds (x, x, x, LF); LF.opposite = RF' – falsetru

Répondre

-1

vous pouvez probablement faire quelque chose aki comme

RF = locals()[LF.opposite] 

Cependant, il est préférable de ne faire que renvoyer les références les unes aux autres plutôt que d'essayer de désosser l'autre instance plus tard, ce qui est beaucoup plus erreur enclin. Vous pouvez le faire en reportant la valeur de l'attribut opposite jusqu'à ce que les deux objets ont été créés

class Feets(object): 
    def __init__(self): 
     self.opposite = None 

    def set_opposite(self, other): 
     self.opposite = other 
     other.opposite = self 

LF = Feets() 
RF = Feets() 
LF.set_opposite(RF) 
-1

Vous pouvez bien sûr faire une recherche de l'objet quelle que soit la portée qu'elle est. Si l'objet est dans une portée globale, vous le trouverez en utilisant globals()[name] s'il s'agit d'un attribut d'instance ou de classe que vous utiliserez getattr(obj_or_class, name). Cependant, vous pouvez utiliser un objet qui fait référence ou qui peut créer l'autre objet à la demande au lieu de devoir effectuer une recherche. Cela aurait l'avantage de ne pas avoir besoin de savoir où chercher l'autre objet. Par exemple:

class FootCreator: 
    def __init__(*args, **kwds): 
      self.args = args 
      self.kwds = kwds 

    def other(self, other): 
      self.other = other 

    def __call__(self): 
      try: 
       return self.feets 
      except: 
       pass 
      self.feets = Feets(other=self.other, *self.args, self.**kwds) 
      return self.feets 

class Feets: 
    def get_other(self): 
      return self.other() 

La solution où vous définissez la référence à l'autre explicitement après la création pourrait être non-OO, car il pourrait casser invariance (mais d'autre part, les objets ne sera pas complète tant que l'autre a été créé de toute façon). Une solution similaire serait de créer et d'initialiser l'objet séparément:

lf = Feets.__new__() # lf created, but not initialized yet 
rf = Feets.__new__() # rf created, but not initialized yet 
lf.__init__(..., other=rf) # initialize (existing) lf 
rf.__init__(..., other=lf) # initialize (existing) rf 
+0

Au lieu de simplement downvoting, il serait utile de souligner ce qui ne va pas avec les réponses. Il existe maintenant deux réponses qui ont été downvoted sans aucun commentaire sur ce qui ne va pas avec eux. – skyking