2016-11-29 10 views
2

私は2つのクラスが1つの関数f(x)以外の共通のものを共有しています。この場合pythonクラスの継承コードを再利用

class A(object): 
    def __init__(self): 
     // some stuff 
    def g(self): 
     // some other stuff 
    def f(self, x): 
     // many lines of computations 
     q = ... 
     y = ... 
     return y 

class B(A): 
    def f(self, x): 
     // same many lines as in A 
     q = ... 
     y = ... 
     // a few extra lines 
     z = ... # z needs both y and q 
     return z 

、私は、クラスBにゼロからf(x)を定義する必要がありますか? A.f(x)にコードを再利用するためのトリックはありますか?私は考えることができる

一つの方法は、その後、

def f(self.x): 
    y = A.f(self, x) 
    // a few extra lines 
    z = ... # using y and self.q 
    return z 

それともA.f(x)f(x)のBの定義にA.f(self, x)を呼び出し、その後、qyの両方を返してみましょう次の操作を行い、qインスタンスプロパティself.qを作ることです。

これは標準的な方法ですか?より良いものがありますか?

+0

'self.q'は、インスタンスのプロパティになります。 –

+0

が修正されました。ありがとう。 – nos

+0

私にとって有効なアプローチのようです。 'B'が' g'関数を継承しないのは問題ですが? –

答えて

0

コードをクラスの周りに整理したいとしましょう。その場合は、その後、私は強く、スーパークラスを参照するようにsuperを使用することをお勧めします:

class MyA(object): 
    def f(self, x): 
     print 'MyA' 
     return x 


class MyB(MyA): 
    def f(self, x): 
     print 'MyB' 
     print super(MyB, self).f(x) 

このアプローチは、あなたがクラスに固執することを可能にし、継承したクラスを参照する慣用的な方法です。

このようにコードを整理する必要がない場合や、これらのクラスを気にしないコードの他の部分で使用できる関数に分割する理由がある場合は、fロジックを関数に変換します。

はここに例を示します

def f(x): 
    return x 


class MyA(object): 
    def f(self, x): 
     return f(x) 


class MyB(MyA): 
    def f(self, x): 
     y = f(x) 
     ... 
     return y