2010-05-09 8 views
20

Wenn ich zwei Klassen habe, und eine von ihnen hat eine Funktion, die ich in meiner anderen Klasse verwenden möchte, was verwende ich, damit ich meine Funktion nicht umschreiben muss?Python mit Methoden aus anderen Klassen

Antwort

25

Es gibt zwei Möglichkeiten:

  • Instanciate ein Objekt in Ihrer Klasse, rufen Sie dann die gewünschte Methode auf sie
  • Verwendung @classmethod eine Funktion in einer Klassenmethode drehen

Beispiel:

class A(object): 
    def a1(self): 
     """ This is an instance method. """ 
     print "Hello from an instance of A" 

    @classmethod 
    def a2(cls): 
     """ This a classmethod. """ 
     print "Hello from class A" 

class B(object): 
    def b1(self): 
     print A().a1() # => prints 'Hello from an instance of A' 
     print A.a2() # => 'Hello from class A' 

oder Vererbung falls:

class A(object): 
    def a1(self): 
     print "Hello from Superclass" 

class B(A): 
    pass 

B().a1() # => prints 'Hello from Superclass' 
+1

schrecklich und unlesbar IMHO. –

+3

Hier gibt es keine Mehrfachvererbung. Dies ist eine einzelne Vererbung, obwohl Sie möglicherweise an eine hierarchische Vererbung denken. – Nikwin

+0

@Nikwin, +1, wie ich das gerade sagen wollte. –

6

Sie erstellen eine Klasse, von der beide Klassen erben.

Es gibt mehrere Vererbung, also wenn sie bereits ein Elternteil haben, ist es kein Problem.

class master(): 
    def stuff (self): 
     pass 

class first (master): 
    pass 


class second (master): 
    pass 


ichi=first() 
ni=second() 

ichi.stuff() 
ni.stuff() 
21

Es gibt mehrere Ansätze:

  • Inheritance
  • Delegation
  • Super hinterhältig Delegation

Die folgenden Beispiele verwenden jeweils zum Teilen einer Funktion, die ein Mitglied druckt.

Inheritance

class Common(object): 
    def __init__(self,x): 
     self.x = x 
    def sharedMethod(self): 
     print self.x 

class Alpha(Common): 
    def __init__(self): 
     Common.__init__(self,"Alpha") 

class Bravo(Common): 
    def __init__(self): 
     Common.__init__(self,"Bravo") 

Delegation

class Common(object): 
    def __init__(self,x): 
     self.x = x 
    def sharedMethod(self): 
     print self.x 

class Alpha(object): 
    def __init__(self): 
     self.common = Common("Alpha") 
    def sharedMethod(self): 
     self.common.sharedMethod() 

class Bravo(object): 
    def __init__(self): 
     self.common = Common("Bravo") 
    def sharedMethod(self): 
     self.common.sharedMethod() 

Super hinterhältig Delegation
Diese Lösung basiert auf der Tatsache ab, dass es nichts besondere über Python Mitglied Funktionen; Sie können jede Funktion oder jedes aufrufbare Objekt verwenden, solange der erste Parameter als Instanz der Klasse interpretiert wird.

def commonPrint(self): 
    print self.x 

class Alpha(object): 
    def __init__(self): 
     self.x = "Alpha" 
    sharedMethod = commonPrint 

class Bravo(object): 
    def __init__(self): 
     self.x = "Bravo" 
    sharedMethod = commonPrint 

Oder eine ähnlich hinterhältige Art und Weise Delegation zu erreichen, ist ein aufrufbare Objekt zu verwenden:

class Printable(object): 
    def __init__(self,x): 
     self.x = x 
    def __call__(self): 
     print self.x 

class Alpha(object): 
    def __init__(self): 
     self.sharedMethod = Printable("Alpha") 

class Bravo(object): 
    def __init__(self): 
     self.sharedMethod = Printable("Bravo") 
Verwandte Themen