2016-04-24 6 views
-2

Angenommen, ich habe zwei Dateien, file1.py und file2.py. In file1.py ich zwei Klassen definieren, erbt man von der anderen Seite:Override-Methode der Klasse in einer anderen Datei

file1.py:

class Class1: 
    def __init__(self): 
     pass 

    def func1(self): 
     return "Hello world!" 

class Class2(Class1): 
    def __init__(self): 
     pass 

    def func2(self): 
     return self.func1() 

So, jetzt bin ich in der Lage func1() und func2() von Class2 zu nennen.

file2.py:

import file1 

class Class3(file1.Class2): 
    def __init__(self): 
     pass 

Frage: Wie kann ich func1() von Class1 in ändern file2.py, so dass func2() in Class2 kehrt die gleiche wie func1()?

So dies nicht mag:

class Class3(file1.Class2): 
    ... 
    def func1(self): 
     return "Another string" 
+2

Es ist nicht ganz klar, was Sie wollen, aber es klingt wie 'Class3' sollte nicht von' Class2' erben, wenn einfach überschreiben 'Class3.func2()' ist nicht die Lösung. – chepner

+0

@chepner Es ist ein bisschen schwierig, das obige ist nur ein Skelett einer Klasse in der Python-Standard-Bibliothek (in file1.py definiert). file2.py ist meine eigene Datei, ich möchte den Code in der Datei in Site-Paketen nicht ändern! – linusg

Antwort

1

func1 Arbeit überschreiben würde?

class Class(file1.Class2): 
    def func1(self): 
     print "Class3.func1" 

c = Class3() 
c.func2() 

Da func2 nicht in Class3 definiert ist, wird Class2.func2 genannt. Im Rumpf dieser Funktion ist self jedoch immer noch eine Instanz von Class3, also self.func1() ruft Class3.func1, nicht Class1.func1. Das unterscheidet sich von

d = Class2() 
d.func2() 

wo self in Class2.func2 ist eine Instanz Class2. Class2 definiert nicht func1, also wird Class1.func1 aufgerufen.

+0

Hey, vielen Dank, das funktioniert! Ich habe nicht darüber nachgedacht, aber während 'func1()' nicht in 'Class3' definiert ist, scheint es eine feine Lösung zu sein. Ich habe das verwendet, um eine Funktion von der 'FTP' Klasse in' ftplib' Modul in meiner Klasse zu überschreiben, die von 'FTP_TLS' erbt, die von' FTP' erbt ... :) – linusg

0

Ich denke, Sie möchten monkeypatch Class1.func1.

c2 = Class2() 
print(c2.func2()) 
Hello world! 

def new_func1(self): 
    return "Another string" 

Class1.func1 = new_func1 # This is monkey patching. 

print(c2.func2()) 
Another string 

Aber dies könnte einen anderen Code brechen, die Class1 oder Class2 verwendet.

+0

Dies ändert das Verhalten aller Klassen mit 'Class1 "Als Vorfahre, nicht nur' Class3'. – chepner

+0

Danke, aber ich kann das nicht mit den ftplib-Klassen machen ... – linusg

+0

@chepner Ich weiß, daher das "das könnte Sachen kaputt machen". Es scheint mir genau das zu sein, wonach das OP fragt: "Wie kann ich func1() von Class1 in file2.py ändern ..." aber wie du gesagt hast, ist nicht ganz klar, was sie wollen. – Goyo