2016-06-21 81 views
0

我想猴子补丁私人和部分类的功能,但我也想调用修补功能。在python 2中调用老功能的猴子补丁私人实例功能

例子:

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

你能告诉我们没有用的代码吗?如果你想调用覆盖的方法,你应该把它存储在某个地方。 – syntonym

+1

具有'__'的属性名称被破坏,即在这里看到https://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references。你应该可以通过'SomeClass._someclass__some_function'来获取它。 – syntonym

+0

感谢您的帮助,它的工作原理是:D:D。这是所需的答案(但应该是'SomeClass._SomeClass__some_function')。 – ChristophLSA

回答

2

属性与双下划线__的名称错位,需要在the documentation描述由重整名称访问:

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