0

我想修补一个私有的和属于类的函数,但我也想调用修补的函数。

例子:

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'
4

1 回答 1

2

带有双下划线的属性__是名称错位的,需要按文档中所述的错位名称访问:

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

于 2016-06-21T12:08:16.550 回答