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!
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!
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
Ich denke, dass dies die bisher vollständigste Antwort für mich, ein Neuling von Python sein könnte. :) – jeffrey
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-)
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
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.
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
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
Bitte lesen Sie die [Hilfe bearbeiten] (http://stackoverflow.com/editing-help) und formatieren Sie Ihren Beitrag neu. –
Ist 'att' ein Attribut der' Klasse A' oder einer Instanz der Klasse? – martineau
att ist ein Attribut der Klasse A. Vielen Dank für die schnelle Antworten! – jeffrey