• Python进阶05 函数property


    Python中有一个被称为属性函数(property)的概念,可以做一些很实用的事情。
    1、将类方法转换为只读属性
    2、重新实现一个属性的setter和getter方法

    一、装饰器

    1、基本的@property使用,可以把函数当做属性用

    使用属性函数的最简单的方法之一是将它作为一个方法的装饰器。这可以将一个类方法转变成一个类属性。当需要做某些值的处理或者做转换函数时这很有用。

    class Person:
        @property
        def get_name(self):
            print('get name.')
    
    
    def main():
        person = Person()
        person.get_name
    
    
    if __name__ == '__main__':
        main()
    
    结果:
    get name.

     2、@property的set,deleter,get

    class Person:
        @property
        def name(self):
            print('@name')
    
        @name.setter
        def name(self, name):
            print('@name.setter: ' + str(name))
    
        @name.deleter
        def name(self):
            print('@name.deleter')
    
    
    p = Person()
    p.name = 'Mike'
    p.name
    del p.name
    
    结果:
    @name.setter: Mike
    @name
    @name.deleter

    注意这三个函数的名称要保持一致。

    3、示例

    class Person:
        def __init__(self):
            self.title = 'Mike'
    
        @property
        def name(self):
            return 'Mr ' + self.title
    
        @name.setter
        def name(self, title):
            self.title = title
    
        @name.deleter
        def name(self):
            del self.title
    
    
    p = Person()
    print(p.name)
    
    p.name = 'John'
    print(p.name)
    
    del p.name
    
    结果:
    Mr Mike
    Mr John

    二、使用property替代 setter 和 getter 方法

    1、property函数操作替代属性的get和set方法

    假设我们要优化历史代码,通过property我们可以有一些更优雅的方法。

    class Rectangle:
        def __init__(self):
            self.width = 0
            self.height = 0
    
        def set_size(self, size):
            self.width, self.height = size
    
        def get_size(self):
            return self.width, self.height
    
        size = property(get_size, set_size)
    
    
    r = Rectangle()
    r.width = 10
    r.height = 5
    
    print(r.size)
    
    r.size = 150, 100
    print(r.width)
    
    结果:
    (10, 5)
    150

    2、函数property的工作原理

    property其实并不是函数,而是一个类。它的实例包含一些魔法方法,而所有的魔法都由这些方法完成的。这些方法为__get__、__set__和__delete__等,它们一道定义了所谓的描述符协议。只要对象实现了这些方法中的任何一个,它就是一个描述符。描述符的独特之处在于其访问方式。例如,读取属性时,如果它关联的是一个实现了__get__的对象,将不会返回这个对象,而是调用方法__get__并将其结果返回。

    class property([fget[, fset[, fdel[, doc]]]])
    # fget -- 获取属性值的函数
    # fset -- 设置属性值的函数
    # fdel -- 删除属性值函数
    # doc -- 属性描述信息

    有关描述符的详细信息,请参阅 https://docs.python.org/3/howto/descriptor.html

    对于新式类,应使用property特性而不是存取方法。

    参考文章:

    https://www.cnblogs.com/blitheG/p/8028009.html
    https://blog.csdn.net/weixin_42670402/article/details/83216845

  • 相关阅读:
    类模板分文件编写
    bridge docker0 is still up;can`t delete it
    记录一次springboot+vue+axios进行大文件上传失败的问题(前端+后端)
    Vue学习(三)
    Vue学习(一)
    SpringBoot使用Resttemplate进行Basic认证登录和Restful接口调用
    kerberos创建用户和keytab文件
    如何实现docker跨主机之间容器通信问题(方法二)
    Node.js安装及环境配置之Windows篇
    win10 无法安装,安装报错2503、2502msi文件
  • 原文地址:https://www.cnblogs.com/mazhiyong/p/12552073.html
Copyright © 2020-2023  润新知