2012-03-28 134 views
14

有人可以展示一個簡單的例子嗎?我想達到什麼在Python 2.6使用PEP 3129已經實現,但使用的類不作爲布魯斯·埃克爾解釋herepython:通過將裝飾器定義爲類來裝飾一個類

以下工作:

class Decorator(object): 
    def __init__(self, arg): 
     self.arg = arg 

    def __call__(self, cls): 
     def wrappedClass(*args): 
      return cls(*args) 
     return type("TestClass", (cls,), dict(newMethod=self.newMethod, classattr=self.arg)) 

    def newMethod(self, value): 
     return value * 2 

@Decorator("decorated class") 
class TestClass(object): 
    def __init__(self): 
     self.name = "TestClass" 
     print "init %s"%self.name 

    def TestMethodInTestClass(self): 
     print "test method in test class" 

    def newMethod(self, value): 
     return value * 3 

除,在上面,wrappedClass不是類但被操作來返回類類型的函數。我想寫出相同的可調用方式如下:

def __call__(self, cls): 
     class wrappedClass(cls): 
      def __init__(self): 
       ... some code here ... 
     return wrappedClass 

這將如何完成? 編輯:我不完全知道什麼進入「」「......一些代碼在這裏......‘’」

+0

您是否試過自己發佈的代碼?它應該工作。 – 2012-03-28 11:04:31

+0

使用該功能的第一部分確實起作用。我怎麼會把wrappedClass寫成真正的類呢? – tsps 2012-03-28 11:08:26

+1

你的裝飾者應該做什麼?我不能告訴你什麼代碼必須進入「一些代碼」,而不知道代碼應該做什麼。 – 2012-03-28 12:41:58

回答

13

如果你想覆蓋new_method(),只要做到這一點:

class Decorator(object): 
    def __init__(self, arg): 
     self.arg = arg 
    def __call__(self, cls): 
     class Wrapped(cls): 
      classattr = self.arg 
      def new_method(self, value): 
       return value * 2 
     return Wrapped 

@Decorator("decorated class") 
class TestClass(object): 
    def new_method(self, value): 
     return value * 3 

如果你不想改變__init__(),你不需要覆蓋它。

2

在此之後,類NormalClass成爲ClassWrapper 實例

def decorator(decor_arg): 

    class ClassWrapper: 
     def __init__(self, cls): 
      self.other_class = cls 

     def __call__(self,*cls_ars): 
      other = self.other_class(*cls_ars) 
      other.field += decor_arg 

    return ClassWrapper 

@decorator(" is now decorated.") 
class NormalClass: 
    def __init__(self, name): 
     self.field = name 

    def __repr__(self): 
     return str(self.field) 

測試:

if __name__ == "__main__": 

    A = NormalClass('A'); 
    B = NormalClass('B'); 

    print A 
    print B 
    print NormalClass.__class__ 

輸出:

一個裝飾了。
B現在裝飾。
__main __。classWrapper

+2

你忘記了在__call__方法中返回'other'變量 – 2014-11-09 09:26:08