2012-03-16 142 views
2

讓我先說我想做什麼。我想爲一個變量創建一個惰性包裝,就像我在記錄所有的方法調用和操作符調用時一樣,並在稍後指定變量來調用它時對它們進行評估。因此,我希望能夠攔截所有的方法調用和操作符調用以及特殊的方法,以便我能夠處理它們。然而,__getattr__不會攔截運算符調用或__str__等,所以我想知道是否有一種通用的方法來重載所有的方法調用,或者我應該動態創建一個類並複製它的所有代碼(我已經做到了,但很醜陋)。Python攔截方法調用

+1

我寫了一個[這個問題]的答案(http://stackoverflow.com/questions/9057669/how-can-i-intercept-calls-to-pythons-magic-methods-in-new-style-classes/9059858#9059858)與您想要做的相似。 – kindall 2012-03-16 00:31:03

+0

甚至沒有'__getattribute__'在dunder方法上被調用。討厭鬼。 – 2012-03-16 04:20:40

回答

0

它可以做到,但是,它變得「醜陋」 - 我曾經寫過一個懶惰的裝飾器,它將任何函數變成了「懶惰計算函數」。

基本上,我發現在Python中實際使用對象的值的唯一時刻是調用其中一個特殊的「dunder」方法。例如,當你有一個數字時,它的值只有當你在另一個操作中使用它時,或者將它轉換爲IO的字符串(它也使用「dunder」方法)時,纔會使用該值。

因此,我的包裝將參數賦值給一個函數調用,並返回一個特殊的對象 ,它有潛在的所有「dunder」方法。就在調用其中一個方法時,調用原始函數 - 然後將其返回值緩存以供進一步使用。

的實施是在這裏: https://bitbucket.org/jsbueno/metapython/src/510a7d125b24/lazy_decorator.py

很抱歉的文字和葡萄牙語大部分呈現的是。

+0

你是對的,'__getattribute__'不在dunder方法上調用。 – 2012-03-16 04:21:30