如何有效和系统地过载Python类方法

时间:2011-01-17 22:16:01

标签: python inheritance methods overloading boilerplate

假设你有一个Python(> = 2.6)类,有很多(数百!)个方法。现在有人想要继承它,但意识到大多数基类方法只需要一些简单的“调整”。此外,只有少数不同的方法可以调整这些方法。一些涉及输入转换,一些输出转换,一些涉及。

更具体地说,我正在寻找一个(简单)继承的解决方案,我可以提供基类和应用特定转换的方法列表(列表),而不是将每个样板代码添加到每个重载方法。

谢谢, 吃

跟进。
根据gabo10yf的答案,我提出了一个解决方案:

class B(object):
    def f1(self, val):
        print '1: ', val
    def f2(self, val):
        print '2: ', val
def decorator(f):
    def g(self, *args, **kwargs):
        print 'entering'
        result= f(self, *args, **kwargs)
    return g

class A(B):
    pass

_overridden= ['f1', 'f2']
def override(cls):
    for name in _overridden:
        setattr(cls, name, decorator(getattr(cls, name).im_func))
override(A)

if __name__== '__main__':
    b= B()
    b.f1(1)
    b.f2(2)
    a= A()
    a.f1(1)
    a.f2(2)

它似乎真的有效。然而它感觉几乎太简单了,它肯定还必须包含一些模糊的问题?无论如何,谢谢你们让我弄清楚这一点!

4 个答案:

答案 0 :(得分:2)

我建议使用某种形式的面向预期的编程。使用Logilab library,可以很容易地将包装器放在类的所有方法中。

答案 1 :(得分:2)

我希望这会有所帮助:


 # the base class
class B(object):
    def f1(self, val):
        pass
    def f2(self, val):
        pass

def decorator(cls, f): def g(self, *args, **kwargs): # do stuff result = f(self, *args, **kwargs) # do more stuff return g

class A(B): _overridden = ['f1', 'f2'] @classmethod def load(cls): for name in cls._overridden: setattr(name, decorator(getattr(name).im_func))

A.load()

为了处理类和静态方法,可能需要做一些更改。

答案 2 :(得分:0)

在我继承之前,我会考虑装饰器。

我也会考虑重构那个类 - 数百种方法向我提出“上帝反模式”。

答案 3 :(得分:0)

  

假设你有一个Python(> = 2.6)   有很多(数百!)的课程   方法

然后我将重构该类,因为类设计已经破解。

此外,您可以通过monkey patching所述类的实例轻松实现给定结果。