python中父class字段的重载和包装方法

Overloading and wrapping method of field of parent class in python

例如我有这样的东西:

class A(object):
    def __init__(self):
        pass

    def foo(self, a, b, c):
        return a + b + c


class B(object):
    def __init__(self):
        self.b = A()


def wrapper_func(func):

    def wrapper(self, *args, **kwargs):
        return func(self, a=3, *args, **kwargs)

    return wrapper


class C(B):
    def __init__(self):
        pass

    @wrapper_func
    def ???

是否可以在不继承 class 的情况下重载然后包装父 B class 字段的方法 foo 到 python A?我确实需要包装器,因为我有具有相同参数的不同方法,但同时我必须保存原始 class B 方法本机(除了重载)。

使用super初始化C的父class,然后将所有参数传递给组合class实例的foo方法A() 通过 继承的 属性 b 的 class C:

def wrapper_func(func):
    def wrapper(self, *args, **kwargs):
        kwargs['a'] = 3
        return func(self, *args, **kwargs)
    return wrapper


class C(B):
    def __init__(self):
        super(C, self).__init__()

    @wrapper_func
    def bar(self, *args, **kwargs):
        return self.b.foo(*args, **kwargs) # access foo via attribute b

试用:

c = C()
print(c.bar(a=1, b=2, c=3))
# 8  -> 3+2+3

要通过 c.b.foopatch c.b.foo 方法和新的 bar 方法调用装饰函数:

class C(B):
    def __init__(self):
        super(C, self).__init__()
        self._b_foo = self.b.foo
        self.b.foo = self.bar

    @wrapper_func
    def bar(self, *args, **kwargs):
        return self._b_foo(*args, **kwargs) 

试用:

c = C()
print(c.b.foo(a=1, b=2, c=3))
# 8  -> 3+2+3