繁体   English   中英

Python 补丁内部 class __call__ 方法

[英]Python patch internal class __call__ method

我有一个 class B,我想对其进行单元测试。 class 在内部实例化另一个 class A 并通过它的call方法调用它。 如何修补 class A 及其init和 __call__methods?

class A:
    def __init__():
        ....
        
    def __call__():
        ....

class B:
    
    def my_method():
        a = A()
        a()
        
def test_b_my_method():
...

您可以为此使用装饰器


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

    def __call__(self):
        return self._foo + 1

class B:
    def my_method(self):
        a = A()
        return a()

def patch_init(fn):
    def wrap(*args, **kwargs):
        self = args[0]
        fn(*args, **kwargs) # calls A.__init__(*args, **kwargs)
        self._foo = 2
    return wrap

def patch_call(fn):
    def wrap(*args, **kwargs):
        res = fn(*args, **kwargs) # calls A.__call__(*args, **kwargs)
        return res * 2
    return wrap

if __name__ == "__main__":
    # unpatched
    b = B()
    print(b.my_method()) # prints 2 (self._foo + 1)
    # patched
    A.__init__ = patch_init(A.__init__)
    A.__call__ = patch_call(A.__call__)
    b = B()
    print(b.my_method()) # prints 6 (self._foo + 1) * 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM