讓我先說我想做什麼。我想爲一個變量創建一個惰性包裝,就像我在記錄所有的方法調用和操作符調用時一樣,並在稍後指定變量來調用它時對它們進行評估。因此,我希望能夠攔截所有的方法調用和操作符調用以及特殊的方法,以便我能夠處理它們。然而,__getattr__
不會攔截運算符調用或__str__
等,所以我想知道是否有一種通用的方法來重載所有的方法調用,或者我應該動態創建一個類並複製它的所有代碼(我已經做到了,但很醜陋)。Python攔截方法調用
2
A
回答
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
相關問題
- 1. Python中的攔截方法調用
- 2. .NET方法調用攔截
- 3. 攔截subprocess.Popen調用在Python
- 4. C#4攔截方法調用
- 5. 攔截方法調用Objective-C
- 6. 如何攔截dll方法調用?
- 7. 攔截調用定義的PHP方法
- 8. 如何「攔截」測試方法調用?
- 9. 統一攔截調用基本方法
- 10. 攔截PHP中的方法調用
- 11. 攔截每個http調用ES6方法
- 12. 攔截javascript調用
- 13. C#AOP方法子方法調用的攔截?
- 14. 多重方法攔截和攔截器重用
- 15. JUnit:攔截方法調用,然後調用不同的參數
- 16. 使用屬性攔截然後重新發出方法調用
- 17. 攔截COM dllhost.exe調用
- 18. Dojo - 攔截XHR調用
- 19. UITextView攔截調用setSelectedRange?
- 20. 我如何能攔截到新式類Python的「神奇」的方法的調用?
- 21. Python:你如何攔截一個方法調用來改變函數參數?
- 22. 無法讓Guice方法攔截工作
- 23. 爲什麼這個方法調用不被攔截?
- 24. 如何攔截Boo中的方法調用?
- 25. 在Grails/Groovy中攔截或重命名方法調用
- 26. 攔截所有客觀的c方法調用
- 27. 如何攔截一個類的方法調用
- 28. 如何攔截C#中的靜態方法調用
- 29. 是否可以攔截Perl方法調用?
- 30. 如何攔截ruby中的方法調用?
我寫了一個[這個問題]的答案(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
甚至沒有'__getattribute__'在dunder方法上被調用。討厭鬼。 – 2012-03-16 04:20:40