Monkey Patch私有实例函数在python 2中调用旧函数

时间:2016-06-21 10:59:38

标签: python mocking private monkey patch

我想修补一个私有和类的一部分的函数,但我也想调用补丁函数。

示例:

class SomeClass:
    def __some_function(self, foo):
        return do_something()

现在我想写一些类似

的内容
def new_function(self, foo)
    if foo == 'bar':
        return True
    return super(self).__some_function(foo)

SomeClass.__some_function = new_function

我试图用装饰器覆盖这个但是我在调​​用旧函数时遇到了问题,因为它无法访问。我还检查了模拟库,但是没有通过调用带参数的旧函数来理解这样的事情。

我试过的装饰者:

def patch_something(method):
    def new_function(self, foo):
        if foo == 'bar':
            return True
        return method(self, foo)
    return new_function

SomeClass.__some_function = patch_something(SomeClass.__some_function)

我收到此错误(该类位于另一个文件中 - 这是一个问题吗?)。

AttributeError: type object 'SomeClass' has no attribute '__some_function'

1 个答案:

答案 0 :(得分:2)

带有双下划线result的属性名称已损坏,需要按照the documentation中所述的错位名称进行访问:

  

由于类私有成员有一个有效的用例(即为了避免名称与子类定义的名称冲突),对这种称为名称修改的机制的支持有限。形式__spam的任何标识符(至少两个前导下划线,最多一个尾随下划线)在文本上用_classname__spam替换,其中classname是当前类名,其中前导下划线被剥离。只要它出现在类的定义中,就可以在不考虑标识符的句法位置的情况下完成这种修改。