1

假设您有一个 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

4 回答 4

2

我建议使用某种形式的面向切面编程。使用Logilab 库,可以很容易地对类的所有方法进行包装。

于 2011-01-17T23:30:54.430 回答
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()

为了处理类和静态方法,可能必须进行一些更改。

于 2011-01-18T04:16:31.713 回答
0

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

我也会考虑重构那个类——数百种方法对我来说是“上帝的反模式”。

于 2011-01-17T22:26:37.457 回答
0

假设您有一个 Python (>=2.6) 类,其中包含大量(数百个!)方法

然后我将重构这个类,因为类设计被破坏了。

此外,您可以通过猴子修补所述类的实例来轻松实现给定的结果。

于 2011-01-17T22:26:56.257 回答