2016-11-29 61 views
2

我有两个类共享很多常见的东西,除了一个功能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)中的代码?我能想到的

一种方法是使q实例属性self.q,然后执行以下操作

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

或许让A.f(x)回报都qy,然后调用A.f(self, x)在B的的f(x)定义。

这些方法是否是标准方法?有更好的东西吗?

+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