2017-02-25 1 views
0

Ich versuche, etwas vor oder nach einer Eigenschaft zu tun ist, erhalten oder/und setzen. Der schwierige Teil dieses Codeabschnitts ist, dass ich die ursprüngliche Klasse nicht ändern kann.Wrap erhalten und setzen Sie Attribute Methoden ohne Bearbeitung der ursprünglichen Klasse

Kein Problem für die Methode der Klasse, es funktioniert wie erwartet. Aber ich kann keinen Weg finden, mit Eigenschaften umzugehen. Ich habe einen Fehler:

TypeError: readonly attribute 

Wenn mir jemand helfen könnte, in die richtige Richtung zu finden ...

Dies ist die Klasse I kann nicht geändert werden:

class Test(object): 
    def __init__(self): 
     super(Test, self).__init__() 
     self._param = None 
     self._controler = None 
     self._message = None 
    @property 
    def param(self): 
     return self._param 
    @param.setter 
    def param(self, param): 
     self._param = param 

    @property 
    def controler(self): 
     return self._controler 

    def message(self): 
     print('message') 

Dies ist der Wrapper Ich schrieb zu machen der Job, das wird Teil meines Moduls sein

def add_things_before_and_after(function_to_enhance): 
    def new_wrapper(self): 
     print("Before function execution") 
     function_to_enhance(self) 
     print("After function execution") 
    return new_wrapper 

Dies ist der Code zu schreiben, um den Wrapper und insta zu verwenden nciate der Klasse

# this one works as expected 
Test.message = add_things_before_and_after(Test.message) 
# these two lines does not work 
Test.param.fget = add_things_before_and_after(Test.param.fget) 
Test.controler.fget = add_things_before_and_after(Test.controler.fget) 

test = Test() 
test.message() 
test.param = 1 
print(test.param) 
print(test.controler) 

Antwort

1

Dies ist möglich durch Überschreiben der gesamten param Eigenschaft mit einem neuen zu tun. Ihre Decorator-Funktion muss jedoch festgelegt werden, um den Wert der umbrochenen Funktion zurückzugeben.

Die functools.wraps ist eine gute Möglichkeit, um die Eigenschaften (Name, doc usw.) der verpackten Funktion zu erhalten.

from functools import wraps 

def add_things_before_and_after(function_to_enhance): 
    @wraps(function_to_enhance) 
    def new_wrapper(self): 
     print("Before function execution") 
     r = function_to_enhance(self) 
     print("After function execution") 
     return r 
    return new_wrapper 

# this one works as expected 
Test.message = add_things_before_and_after(Test.message) 

# these two lines should work 
Test.param = property(add_things_before_and_after(Test.param.fget), Test.param.fset) 
Test.controler = property(add_things_before_and_after(Test.controler.fget), Test.controler.fset) 

test = Test() 
test.message() 
test.param = 1 
print(test.param) 
print(test.controler) 

# ==Output== 
# 
# Before function execution 
# message 
# After function execution 
# Before function execution 
# After function execution 
# 1 
# Before function execution 
# After function execution 
# None 
+0

Vielen Dank @kofrasa –

+0

Sie sind herzlich willkommen @ reno. Glückliche Kodierung! – kofrasa

Verwandte Themen