码迷,mamicode.com
首页 > 编程语言 > 详细

【Python】【Property】关于属性装饰器的优化

时间:2019-09-28 01:08:23      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:img   turn   中国   test   import   lse   解释   nbsp   for   

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

【Python】【Property】关于属性装饰器的优化

标签:img   turn   中国   test   import   lse   解释   nbsp   for   

原文地址:https://www.cnblogs.com/stanmao/p/11601090.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!