2013-12-13 229 views
3

我試着這樣做:Python的裝飾爲

import unittest 

def decorator(cls): 
    class Decorator(cls): 
     def __init__(self, *args, **kwargs): 
      super(Decorator, self).__init__(*args, **kwargs) 

    return Decorator 

@decorator 
class myClass(unittest.TestCase): 
    def __init__(self, *args, **kwargs): 
     super(myClass, self).__init__(*args, **kwargs) 
     self.test = 'test' 

    def test_test(self): 
     pass 


myClass().run() 

但我在MyClass.__init__得到遞歸。有什麼方法可以避免這種情況?

+2

提示OP:如果您在此處粘貼簡化代碼,請確保它確實仍然顯示您即將解決的問題。在這種情況下,只需將發佈的代碼粘貼到交互式Python中並嘗試一下。 – Alfe

+0

我已將代碼更新爲問題版本。 – Eugene

+1

什麼是「裝飾器」應該扮演的角色是「類裝飾器」... –

回答

7

你不能在這樣的裝飾類中使用super(myClass, self)

myClass的擡頭爲全球性的,全球myClass反彈Decorator,所以你告訴的Python在類MRO尋找__init__Decorator這是myClass,這就要求super(myClass, self).__init__(),仰視myClass開始作爲一個全球性的,這勢必會Decorator

最簡單的解決辦法是不要在這裏使用super()

@decorator 
class myClass(unittest.TestCase): 
    def __init__(self, *args, **kwargs): 
     unittest.TestCase.__init__(self, *args, **kwargs) 
     self.test = 'test' 

這是爲什麼在Python 3中引入了無參數版本super()的原因之一,因此改爲使用方法__class__

可以跳通過一些(很棘手)籃球重新編譯myClass.__init__()方法給它一個myClass封閉綁定到原來的未修飾類對象,而不是,但對於一個單元測試,我不會理會。