2014-02-18 17 views
1

鑑於函數作爲參數傳遞給裝飾器,是否可以通過正在裝飾的方法的參數獲取對象實例的引用?例如下面的method1正在裝飾,我想打印對象實例的名稱。從我最初的研究看來,我可能需要使用mixin來跟蹤類實例並搜索/過濾正確的對象,但這看起來有點重要;因爲該方法通過自身引用了它的對象。使用相同的引用來打印裝飾器作用域的實例名稱是可行的嗎?是否可以在Python中的函數裝飾器中獲取對象實例的引用?

感謝

def customdecorator(f): 
    print f.self.method2(a,b, params) // where owner would be the reference to t (self) 

class Test(object): 

    def __init__(self, name): 
     self.name = name 

    @customdecorator 
    def method1(self): 
     return 1 

    def method2(self, a,b): 
     #do something 





t = Test() 
+0

什麼在做了點?你可以在你的方法裏面打一個打印...... – Netwave

+0

裝飾器的第一個參數是方法的第一個參數:'self'。 –

+0

也許我簡化了它,而不是打印名字是什麼abbount執行方法。 – user465374

回答

1

的類被聲明時,裝飾進行評估。因此,在那裏沒有對象,並且沒有辦法從裝飾器中獲取對象。

請參閱@ user2357112關於如何在函數調用時獲取對象的答案。

6
import functools 

def nameprinting(f): 
    @functools.wraps(f) 
    def wrapper(self, *args, **kwargs): 
     print self.name 
     return f(self, *args, **kwargs) 
    return wrapper 

當一個裝飾器被調用時,它應該對作爲參數給定的函數應用一些轉換,創建一個新的函數。當函數被調用時,它有一個self可以使用。在這種情況下,返回的功能打印self的名稱,然後委託給f

functools.wraps是一個輔助那份f的文檔字符串和其他一些東西到wrapper功能。)

+0

1打我給它你有更多優雅的解決方案包裝:) –

相關問題