2016-04-24 14 views
-2

私は2つのファイル、file1.pyfile2.pyと言っています。 file1.pyでは、私は2つのクラスを定義し、一方が他方から継承:別のファイルのクラスのオーバーライドメソッド

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() 

だから今、私はClass2からfunc1()func2()を呼び出すことができますよ。

file2.py:

​​

が質問:Class2func2()func1()と同じように返すようにがどのように私は、file2.pyClass1からfunc1()を変更できますか?

だから、これを好きではない:

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

あなたが望むものは完全にはっきりしていませんが、 'Class3.func2()'を単に上書きするだけで解決できない場合、 'Class3'は' Class2'を継承してはいけません。 – chepner

+0

@chepnerこれはちょっと難しいですが、上記はPythonの標準ライブラリ(file1.pyで定義されています)のクラスのスケルトンです。 file2.pyは私自身のファイルですが、私はsite-packages内のファイルのコードを変更したくありません! – linusg

答えて

1

func1仕事をオーバーライドしませんか?

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

c = Class3() 
c.func2() 

func2Class3で定義されていないので、Class2.func2が呼び出されます。ただし、その機能の本体では、selfはまだClass3のインスタンスなので、self.func1()Class3.func1であり、Class1.func1ではありません。すなわちClass2.func2selfClass2のインスタンスである

d = Class2() 
d.func2() 

異なります。 Class2func1を定義していないので、Class1.func1が呼び出されます。

+0

ねえ、ありがとう、それは動作します!私はそれについては考えていませんが、 'func1()'は 'Class3'で定義されていませんが、良い解決策であるようです。私は 'FTP'から継承した' FTP_TLS'を継承した私のクラスの 'ftplib'モジュールの' FTP'クラスの関数をオーバーライドするためにこれを使いました。:) – linusg

0

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 

しかし、これはClass1またはClass2を使用して、他のコードを壊すかもしれません。

+0

これは 'Class1 'Class3'だけではなく、祖先として。 – chepner

+0

ありがとうございますが、私はこれをftplibクラスで動作させることはできません... – linusg

+0

@chepner私は知っています。 OPが求めていることはまさに私には見えます。「どのようにして、file2.pyのClass1からfunc1()を変更できますか?」しかし、あなたが言ったように、彼らが望むものは完全にはっきりしていません。 – Goyo

関連する問題