首页 > 解决方案 > 如何用原始类中的包装器调用替换每个函数调用?

问题描述

我有两个类,其中一个是另一个的包装器。原始类中的一个函数使用了一个名为 的方法forward,但我希望它forward在包装后使用包装类的方法,而不是原始的。例如:

class A:
    def __init__(self):
        self.a = 1

    def forward(self, x):
        return self.a + x

    def main(self, x):
        return self.forward(x) + 100


class Wrapper:
    def __init__(self, A):
        self.module = A

    def forward(self, x):
        # Long convoluted code.
        # ..
        # ..

        return self.module.forward(x)


classA = A()
wrapperA = Wrapper(classA)

# Goal: Make classA.main(..) use the forward function from Wrapper instead.

因为包装类具有需要运行的冗长而复杂的代码,所以我希望对forwardfrom的所有调用都main使其forward从包装类调用,而不是从原始调用。

有没有办法在 Python 中做到这一点?

我不使用继承的原因:

  1. 实例化 A 类是内存密集型的。如果我收到 A 类对象作为输入,我想修改它的核心行为。无需实例化另一个对象。

  2. classA在运行时可以是不同的对象类型。

--

我想到的另一种方法是mainWrapper. 但是,问题是自动为 A 中定义的每个方法执行此操作,而无需硬编码。

标签: pythonpython-3.xoop

解决方案


您可以继承WrapperA,并用于super访问父类。

class A:
    def __init__(self, child):
        self.a = 1
        self.child = child

    def forward(self, x):
        return self.a + x

    def main(self, x):
        return self.child.forward(x) + 100

class Wrapper(A):
    def __init__(self):
        super(Wrapper, self).__init__(self, self)

    def forward(x):
        return "whatever"

wrapperA = Wrapper()

但如果你想使用类A,只需继承AWrapper. 否则,我无法弄清楚什么是错的。请不要乱用函数。创建一个你想使用的类,另一个类作为家长,不要混合角色。

#...
class A(Wrapper):
    def __init__(self):
        super(A, self).__init__(self)
#...

推荐阅读