简而言之, 就是把设置属性所需要的过程修改一下, 改成只需要一次装饰就能完成 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 是实例对象. 两个组合在一起, 怎么就变成了访问内部变量了呢?
来源: http://www.bubuko.com/infodetail-3216498.html