python - 如何有效且系统地重载Python类方法

标签 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)

这似乎真的有效。不过感觉有点太简单了,肯定还有一些玄乎的问题吧?无论如何,谢谢你们让我弄明白了!

最佳答案

希望对您有所帮助:


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

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

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

<p>A.load()
</p>

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

关于python - 如何有效且系统地重载Python类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4718520/

相关文章:

php - 引擎盖下的继承

C++:类的只读和只写版本的语义

objective-c - 从 objective-c 调用多个参数到 applescript-objc

Python Opencv Ubuntu 不创建 Windows

javascript - 如何正确处理切换 html5 视频

c++ - 涉及接口(interface)时如何从库中扩展类?

c++ - 处理错误 C++

Python:如何在python、MAC OS中点击屏幕的特定位置

python - Scipy 的线性求和分配给出不正确的结果

java - 打印堆栈内容的递归方法