2016-07-06 64 views
0

對裝飾器有疑問。我想了解python中的裝飾器概念,但在類中使用裝飾器。 with_class.py如何在python中的面向對象的程序中實現裝飾器

class decorate: 
     def __init__(self,f): 
      self.f = f 

     def __call__(self) 
      self.f() 
@decorate 
def foo(): 
    print "inside foo" 
foo() 

我把整個代碼的單個.py文件裏,並執行按預期。 輸出:裏面富氏

但後來我試圖創建一個對象的類裝飾另一個.py文件,並試圖執行獲得相同的輸出。 評論第一個.py文件中的foo(),並在第二個.py文件中使用下面的代碼。

use_class.py

import with_class 
a = with_class.decorate() 

但它拋出錯誤TypeError: __init__ takes exactly 2 arguments(1 given)。預計在撥打__init__時,我們應該提供2個參數。 但是我沒有得到use_class.py上執行方法foo所要傳遞的信息。 我再次試圖通過從__init__中刪除f來使用__call__(self,f),但它也給出了錯誤。 看來我沒有得到這個概念。

+0

如果你已經寫了'decorate'作爲函數,你會通過什麼參數呢?傳遞這個論點。 – user2357112

+0

你爲什麼叫'裝飾'?你應該調用'with_class.foo()'。 – Bakuriu

+0

裝修是一流的。 –

回答

2

@decorate 
def foo(): 
    print "inside foo" 

做什麼是相當於

def foo(): 
    print "inside foo" 

foo = decorate(foo) 

所以foo是裝飾功能(decorate類的對象,真)是with_class模塊綁定到名稱。從use_class.py開始,你應該做

import with_class 

a = with_class.foo() 
+0

如果我想傳遞一個參數給上面的裝飾函數,可以這樣做:: a = with_class.foo(x)並相應地修改with_class.py類裝飾:def __init __(self,f): self.f = ˚F 高清__call __(自我,X) self.f(X) @decorate 高清FOO(X): 打印 「裏富」,X –

+0

現在,如果我想在部位X的傳遞函數。我在with_class.py和use_class.py中定義了functin,我想傳遞給「a = with_class.foo(with_class.decorate.disp())」。 disp()是類中定義的函數。在with_class.py中的代碼被修改爲:class decorate: def __init __(self,f): self.f = f def __call __(self,g) self.f(g)def disp(self):打印「內部顯示」 @decorate def foo(fn): print「inside foo」fn() –