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

class B()  
    ... 

a = A() 

b = B() 

a.att = b 

Wie kann b Referenz von a bekommen? Ich muss hier ein Attribut von a bekommen.Python - wie Klasseninstanzreferenz von einer Attributklasse erhalten?

Danke!

+1

Bitte lesen Sie die [Hilfe bearbeiten] (http://stackoverflow.com/editing-help) und formatieren Sie Ihren Beitrag neu. –

+0

Ist 'att' ein Attribut der' Klasse A' oder einer Instanz der Klasse? – martineau

+0

att ist ein Attribut der Klasse A. Vielen Dank für die schnelle Antworten! – jeffrey

Antwort

0

Sie können eine generische „Referenz()“ Klasse machen, die jeden Bezug von selbst Dictionnary in einem Attribute halten.

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) 

Und dann erstellen Sie Ihre Klassen:

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 

und es verwenden:

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>]} 

Am Ende werden Sie wieder Bezug auf alle Referenzklasse haben von irgendwelchen Eigenschaften

+0

Ich denke, dass dies die bisher vollständigste Antwort für mich, ein Neuling von Python sein könnte. :) – jeffrey

0

Der einfachste Weg wäre, der Methode in B einfach einen zusätzlichen Funktionsparameter hinzuzufügen, der A benötigt, und ihn beim Aufruf übergeben. Oder einfach machen die B init ein A als Argument nehmen, und ändern Sie das Bit in A init zu att werden = B (Selbst-)

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 

Oder eine andere Art und Weise,

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

Dieser Code doesn 't macht viel Sinn ... aber wenn ich Ihre Frage richtig verstehe ...

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 

Könnte eine Antwort sein.

+0

Nur als Randnotiz: Ihr ursprünglicher Code wird nicht funktionieren, weil Sie 'Klasse B()' nicht definiert haben, bevor Sie 'att = B()' aufrufen (deshalb habe ich durch 'pass' ersetzt) ​​ Eine weitere gute Idee ist es, von "object" (dh. Class className (object)) zu erben, wenn Sie eigene Klassen definieren. – 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 
Verwandte Themen