2017-02-25 41 views
0

我想在属性获取或/和设置之前或之后进行一些操作。 这段代码中棘手的部分是我无法修改原始类。包装获取和设置属性方法,而无需编辑原始类

该类的方法没有问题,它按预期工作。但我找不到处理财产的方法。我有一个错误:

TypeError: readonly attribute 

如果有人可以帮助我找到正确的方向...

这是I类不能修改:

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') 

这是我写的,使包装工作,这将是我的模块的一部分

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 

这是编写使用包装和insta的代码nciate类

# 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) 

回答

1

这可能是由一个新覆盖整个param物业办。但是,您的修饰器函数必须修复以返回包装函数的值。

functools.wraps的是保持被包装的函数的属性(名称,文档等)的好方法。

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

非常感谢你@kofrasa –

+0

不客气@ reno-。快乐的编码! – kofrasa