2016-06-21 52 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是當前類名稱,前導下劃線被去除。只要它在類的定義內發生,就不會考慮標識符的語法位置。