2016-04-24 4 views
0

Ich möchte Klasse B wie ein Kind der Klasse A sein:Wie kann ich eine umschließende Klasse für eine andere Klasse in Python definieren?

class A(object): 
    def __init__(self, id): 
     self.id = id 
     b1 = B() 
     b2 = B() 
     self.games_summary_dicts = [b1, b2] 
     """:type : list[B]""" 

class B(object): 
    def __init__(self): 
     ... 
    def do_something_with_containing_class(self): 
     """ 
     Doing something with self.id of A class. Something like 'self.container.id' 
     """ 
     ... 

I ‚do_something_with_containing_class‘ von b1 wollen etwas auf die Instanz von A bis tatsächlich tun, dass es unter ist, also wenn es sich etwas ändert, wird es auch für b2 verfügbar sein.

Gibt es eine Klasse oder eine Syntax dafür?

Antwort

1

Wie Natecat hervorgehoben hat, geben Klasse B ein Mitglied seiner A Eltern zeigen:

class A(object): 
    def __init__(self, id): 
     self.id = id 
     b1 = B(a=self) 
     b2 = B(a=self) # now b1, b2 have attribute .a which points to 'parent' A 
     self.games_summary_dicts = [b1, b2] 
     """:type : list[B]""" 

class B(object): 
    def __init__(self, a): # initialize B instances with 'parent' reference 
     self.a = a 

    def do_something_with_containing_class(self): 
     self.a.id = ... 
+0

Das hat funktioniert! Ich habe vergessen, dass diese Objekte als Referenz und nicht als Wert übergeben werden, also ist es genau das, was ich brauchte. Vielen Dank! –

1

Haben Sie eine Instanzvariable in B, die

0

seiner übergeordneten Instanz von A weist versuchen, diese

class A (object): 
def __init__(self, id): 
    self.id = id 
    b1 = B() 
    b2 = B() 
    self.games_summary_dicts = [b1, b2] 
    """:type : list[B]""" 

class B(A): 
def __init__(self): 
    ... 
def do_something_with_containing_class(self): 
    """ 
    Doing something with self.id of A class. Something like 'self.container.id' 
    """ 
    ... 
+0

Die 'enthaltenden' Formulierung des OP ist bedauerlich. Ich denke, er will Zugriff von 'b2' auf die' A'-Instanz, dass 'b2' ein Mitglied ist, keine tatsächliche Vererbung. – schwobaseggl

+0

Vermeiden Sie die Verwendung der Vererbung, wenn das Problem nur mit der Zusammensetzung gelöst werden kann. – Mikaelblomkvistsson

+0

@schwobaseggl hast du recht. Ich weiß einfach nicht, wie ich es nennen soll. –

Verwandte Themen