2016-12-02 7 views
2

Ich versuche, ein class mit Argumenten zu dekorieren, aber es funktioniert nicht bekommen kann:Python Dekorieren Klasse

Dies ist der Dekorateur:

def message(param1, param2): 
    def get_message(func): 
     func.__init__(param1,param2) 

    return get_message 

Klasse, wo ich den Dekorateur

setzen wollen
@message(param1="testing1", param2="testing2") 
class SampleClass(object): 
    def __init__(self): 
    pass 

Aber das funktioniert nicht, ich bekomme einen Fehler beim Ausführen dieser. Weiß jemand, was das Problem? Ich versuche, einen Dekorator zu erstellen, um Klassen mit einigen Werten zu initialisieren.

+0

Wo gibt der Dekorator das Objekt zurück, um an 'SampleClass' zu binden? –

+0

Ja, das ist, was ich brauchte Hilfe mit. Ich wusste nicht, wie ich das machen sollte. – IoT

+0

Haben Sie versucht, etwas von 'get_message()' zurückzugeben? –

Antwort

7

Ich habe Probleme herauszufinden, was Sie versuchen zu tun. Wenn Sie eine Klasse mit einem Dekorator dekorieren möchten, der Argumente akzeptiert, ist eine Möglichkeit, dies zu tun.

# function returning a decorator, takes arguments 
def message(param1, param2): 
    # this does the actual heavy lifting of decorating the class 
    # this function takes a class and returns a class 
    def wrapper(wrapped): 

     # we inherit from the class we're wrapping (wrapped) 
     # so that methods defined on this class are still present 
     # in the decorated "output" class 
     class WrappedClass(wrapped): 
      def __init__(self): 
       self.param1 = param1 
       self.param2 = param2 
       # call the parent initializer last in case it does initialization work 
       super(WrappedClass, self).__init__() 

      # the method we want to define 
      def get_message(self): 
       return "message %s %s" % (self.param1, self.param2) 

     return WrappedClass 
    return wrapper 

@message("param1", "param2") 
class Pizza(object): 
    def __init__(self): 
     pass 

pizza_with_message = Pizza() 

# prints "message param1 param2" 
print pizza_with_message.get_message() 
+0

Vielen Dank, das ist genau das, was ich machen wollte! – IoT

Verwandte Themen