2012-03-28 15 views
14

誰かがこの簡単な例を示してください。上記では、wrappedClassはないが、除きpython:デコレータをクラスとして定義してクラスをデコレートしてください

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 

:私はブルースEckel氏は、here

次作品を説明しているようなクラスではない機能を使用することを除いてPEP 3129を使ってPython 2.6で実装されてきたものを達成しようとしていますクラス型を返すように操作された関数です。私は次のように同じ呼び出し可能コードを書いています:

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

これはどうでしょうか? EDIT:私はに入るものを全くわからないんだけど "" "...ここにいくつかのコード... """

+0

自分で投稿したコードを試しましたか?それは動作するはずです。 –

+0

機能を使用する最初の部分は機能しません。しかし、wrappedClassを本物のクラスとしてどのように書くのですか? – tsps

+1

あなたのデコレータは何をすべきですか?私は、このコードが何をすべきかを知らずに、どのコードが「ここのコード」に入っているのかを伝えることはできません。 –

答えて

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__ 

出力:

Aは現在装飾されています。
Bが装飾されました。
__main __。classWrapper

+2

__call__メソッドの中で 'other'変数を返すのを忘れました –

関連する問題