2012-08-01 4 views
5

Also hier habe ich ein Problem. Sagen wir, ich habe 2 Elternklassen. Sie erben beide von einer Meisterklasse. Dann sind sie beide Elternklassen für eine Kindklasse. Gibt es eine Möglichkeit herauszufinden (sagen wir, ich bin Vater), mit welcher Mutterklasse ich "ein Kind habe"? Ich brauche das Kind nicht, um herauszufinden, welche Mutterklasse es ist, ich möchte, dass der Vater herausfinden kann, welche Mutterklasse es ist.Python: herauszufinden, "Ehepartner" -Klasse?

Ich weiß, dass dies ein dummes Beispiel ist, aber es ist eine vereinfachte Version von dem, was ich woanders machen muss.

class Master(object): 
    def __init__(self): 
     self.troll() 
     self.trell() 

class Mother1(Master): 
    def troll(self): 
     print 'troll1' 

class Mother2(Master): 
    def troll(self): 
     print 'troll2' 

class Father(Master): 
    def trell(self): 
     print 'trell' 
     print self.figure_out_spouse_class() 

class Child1(Mother1, Father): 
    pass 

class Child2(Mother2, Father): 
    pass 

c = Child1() #should print 'Mother1' 
c = Child2() #should print 'Mother2' 

~
~
~
~

+2

Auch Python nicht stark genug ist, einen Ehepartner zu verstehen. –

Antwort

6

können Sie __bases__ verwenden:

def figure_out_spouse_class(self): 
    return [b.__name__ for b in self.__class__.__bases__ if b != Father] 

(Dies würde die Namen aller "Ehepartner" Klassen zurück, wenn es mehr als ein).

+0

Diese Arbeit ist perfekt! Vielen Dank! –

+1

@ user1137940 - Wenn diese Lösung für Sie funktioniert (wie Sie angegeben haben), sollten Sie sie akzeptieren (klicken Sie auf das kleine Häkchen daneben). Das gibt David einen kleinen Bonus Ruf (und Sie bekommen auch ein wenig). Außerdem können andere, die auf diesen Beitrag stoßen, sofort sehen, welche Antwort die beste ist. (+1 von mir übrigens) – mgilson

1

Sie können an __bases__ der Klasse des Kindes Objekt aussehen, so etwas wie

class Father(Master): 
    def trell(self): 
     print self.__class__.__bases__[0] 
     super(self.__class__, self).troll()