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关于属性装饰器的优化的主要内容,如果未能解决你的问题,请参考以下文章

关于装饰器的两个小练习

Python关于装饰器的练习题

未调用属性装饰器的 setter 方法

Python装饰器的通俗理解

关于路径和自定义装饰器的 Python3 Django 问题

谈谈python修饰器