PythonProperty关于属性装饰器的优化
Posted stanmao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PythonProperty关于属性装饰器的优化相关的知识,希望对你有一定的参考价值。
简而言之,就是把设置属性所需要的过程修改一下,改成只需要一次装饰就能完成get和set请求(del也可以用同样的原理添加)
代码写得不是最优但是可以参考这个思想:
import copy class PropertyTest(object): def __init__(self, fget=None): self.fget = fget self.fset = copy.deepcopy(fget) def __get__(self, instance, owner): return self.fget(instance) def __set__(self, instance, value): self.fset(instance, value) class Person(object): def __init__(self, name=None, age=None, region=None): self.name = name self.age = age self.region = region pass @PropertyTest def name(self, name_value=None): if name_value is None: return self.name else: self.name = name_value @PropertyTest def age(self, age_value=None): if age_value is None: return self.age else: self.age = age_value @PropertyTest def region(self, region_value=None): if region_value is None: return self.region else: self.region = region_value if __name__ == ‘__main__‘: person = Person person.name = "张小凡" person.age = 20 person.region = "中国" print("{}是{}人,年龄{}岁".format(person.name, person.region, person.age))
运行结果:
可以发现,我们的代码只使用了@PropertyTest这一个装饰器。
遇到的问题:
return self.fget(instance) 这行代码应该怎么解释?self.fget是传入的Person对象,instance是实例对象。两个组合在一起,怎么就变成了访问内部变量了呢?
以上是关于PythonProperty关于属性装饰器的优化的主要内容,如果未能解决你的问题,请参考以下文章