我想修补一个私有和类的一部分的函数,但我也想调用补丁函数。
示例:
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'
答案 0 :(得分:2)
带有双下划线result
的属性名称已损坏,需要按照the documentation中所述的错位名称进行访问:
由于类私有成员有一个有效的用例(即为了避免名称与子类定义的名称冲突),对这种称为名称修改的机制的支持有限。形式__spam的任何标识符(至少两个前导下划线,最多一个尾随下划线)在文本上用_classname__spam替换,其中classname是当前类名,其中前导下划线被剥离。只要它出现在类的定义中,就可以在不考虑标识符的句法位置的情况下完成这种修改。