2010-12-02 3 views
1
class A()  
    att = B()  

class B()  
    ... 

a = A() 

b = B() 

a.att = b 

Comment b peut-il obtenir une référence? Je dois obtenir un attribut d'un ici.Python - comment obtenir une référence d'instance de classe à partir d'une classe d'attributs?

Merci!

+1

Veuillez lire l '[aide à la modification] (http://stackoverflow.com/editing-help) et reformater votre message. –

+0

Est-ce que att est un attribut de la classe A ou d'une instance de la classe? – martineau

+0

att est un attribut de classe A. Merci beaucoup pour les réponses rapides !! – jeffrey

Répondre

0

Vous pouvez faire un générique « Référence() » classe, qui gardent toute référence lui-même dans un attributs Dictionnary.

class Reference(object): 
    def __init__(self): 
     self.references = {} 

    def __setattr__(self, key, value): 
     if hasattr(self, 'references'): 
      if isinstance(value, Reference): 
       if not key in value.references: 
        value.references[key] = [] 
       value.references[key].append(self) 

      elif value is None and hasattr(self, key): 
       old = getattr(self, key).references 
       if key in old and self in old[key]: 
        old[key].remove(self) 

     super(Reference, self).__setattr__(key, value) 

Et puis, créez vos classes:

class A(Reference): 
    def __init__(self): 
     super(A, self).__init__() 
     self.att = None 

class B(Reference): 
    def __init__(self): 
     super(B, self).__init__() 
     self.att = None 

et de l'utiliser:

a = A() 
b = B() 

print 'A references', a.references 
print 'B references', b.references 
# A references {} 
# B references {} 

a.att = b 

print 'A references', a.references 
print 'B references', b.references 
# A references {} 
# B references {'att': [<__main__.A object at 0x7f731c8fc910>]} 

A la fin, vous aurez de nouveau référence à toute la classe de référence de toutes les propriétés

+0

Je pense que cela pourrait être la réponse la plus complète jusqu'à présent, pour moi, un débutant de python. :) – jeffrey

0

Le moyen le plus simple serait d'ajouter simplement un paramètre de fonction supplémentaire à la méthode dans B qui a besoin de A, et de le transmettre lorsqu'il est appelé. Ou, il suffit de faire initialisation de B prendre un A comme argument, et changer le bit dans init A à att = B (auto)

0
class A(object): 
    def __init__(self): 
     self.att = B(self) 

class B(object): 
    def __init__(self, a): 
     self.a = a 

a = A() 

a.att.a is a 

Ou une autre façon,

class A(object): 
    def __init__(self, b): 
     b.a = self 
     self.att = b 

class B(object): 
    pass 

a = A(B()) 

a.att.a is a 
0

Ce code doesn Ne faites pas beaucoup de sens ... mais si je comprends bien votre question ...

class A(object): 
    pass  #or whatever you like 

class B(object): 
    def __init__(self, ref): #accept one argument 
     self.ref = ref 

a = A() 

b = B(a) #pass `a` as that argument 

a.att = b 

Peut-être une réponse.

+0

Juste comme une note: Votre code original ne fonctionnera pas parce que vous n'avez pas défini 'class B()' avant d'appeler 'att = B()' (c'est pourquoi j'ai remplacé par 'pass') Une autre bonne idée est d'hériter de "object" (ie 'class ClassName (object)') lorsque vous définissez vos propres classes. – William

0
class A(object): 

    def __init__(self): 
     self._att=None 

    @property 
    def att(self): 
     return self._att 

    @att.setter 
    def att(self, value): 
     self._att = value 
     value.parent = self 


class B(object): 

    pass 

a = A() 

b = B() 

a.att = b 
print b.parent 
Questions connexes