2009-06-05 24 views
2

如何找出我正在初始化裝飾器的類?這是有道理的,我不能夠發現這一點,因爲裝飾者還沒有綁定到課堂上,但是有沒有辦法繞過這個?如何在python初始化期間訪問父類?

class A(object): 
    def dec(f): 
       # I am in class 'A' 
     def func(cls): 
      f(cls) 
     return func 

    @dec 
    def test(self): 
     pass 

我需要知道我是哪一類(由註釋行表示)。

+0

http://stackoverflow.com/questions/805066/how-to-call-a-parent-classs-method-from-child-class-in -python – 2009-06-05 17:17:18

+0

問題805066是關於super(),我看不出這對此有什麼幫助。 – balpha 2009-06-05 17:45:51

回答

3

我不認爲這是可能的。在你定義測試的那一刻,這個類還不存在。

當Python遇到

class A(object): 

它會在其運行它找到在類定義中的所有代碼(包括測試(的定義)和呼叫給裝飾)一個新的命名空間,並且當完成後,它會創建一個新的類對象,並將所有內容放入此代碼執行後留在命名空間中的類中。

所以當裝飾器被調用時,它什麼都不知道。此時,測試只是一個功能。

0

我不明白這個問題。

>>> class A(object): 
    def dec(f): 
     def func(cls): 
      print cls 
     return func 

    @dec 
    def test(self): 
     pass 

>>> a=A() 
>>> a.test() 
<__main__.A object at 0x00C56330> 
>>> 

的參數(cls)是類,A

0

正如納迪亞指出,您需要更具體。 Python不允許這樣的事情,這意味着你正在嘗試做的事情可能是錯誤的。

與此同時,這裏是我的貢獻:關於水手和青蛙的小故事。 (使用構造後級初始化)

class Cruise(object): 
    def arewelostyet(self): 
     print 'Young sailor: I think I am lost, help me :s' 

instance = Cruise() 

instance.arewelostyet() 

def whereami(lostfunc): 
    """ 
    decorator 
    """ 
    def decorated(*args, **kwargs): 
     lostfunc(*args, **kwargs) 
     print 'Frog: Crôak! thou art sailing in class', lostfunc.im_class.__name__ 

    # don't forget to write name and doc 
    decorated.func_name = lostfunc.func_name 
    decorated.func_doc = lostfunc.func_name 

    return decorated 


print '[i]A frog pops out of nowhere[/i]' 

# decorate the method: 
Cruise.arewelostyet = whereami(Cruise.arewelostyet) 

instance.arewelostyet()