zoukankan      html  css  js  c++  java
  • Python 中 property() 函数及 @property 装饰器的使用

    1. property 应用场景

      在获取、设置和删除对象属性的时候,需要额外做一些工作。比如在游戏编程中,设置敌人死亡之后需要播放死亡动画。

      需要限制对象属性的设置和获取。比如用户年龄为只读,或者在设置用户年龄的时候有范围限制。

      这时就可以使用 property 工具,它把方法包装成属性,让方法可以以属性的形式被访问和调用。

    2. property() 函数

      语法:

        property(fget=None, fset=None, fdel=None, doc=None) -> property attribute

      说明:

        fget 是获取属性值的方法。

        fset 是设置属性值的方法。

        fdel 是删除属性值的方法。

        doc 是属性描述信息。如果省略,会把 fget 方法的 docstring 拿来用(如果有的话)

      示例代码:

    class Student:
        def __init__(self):
            self._age = None
    
        def get_age(self):
            print('获取属性时执行的代码')
            return self._age
    
        def set_age(self, age):
            print('设置属性时执行的代码')
            self._age = age
    
        def del_age(self):
            print('删除属性时执行的代码')
            del self._age
    
        age = property(get_age, set_age, del_age, '学生年龄')
    
    
    student = Student()
    # 注意要用 类名.属性.__doc__ 的形式查看属性的文档字符串
    print('查看属性的文档字符串:' + Student.age.__doc__)
    """
    查看属性的文档字符串:学生年龄
    """
    
    # 设置属性
    student.age = 18
    """
    设置属性时执行的代码
    """
    
    # 获取属性
    print('学生年龄为:' + str(student.age))
    """
    获取属性时执行的代码
    学生年龄为:18
    """
    
    # 删除属性
    del student.age
    """
    删除属性时执行的代码
    """        

    3. @property 装饰器

      @property 语法糖提供了比 property() 函数更简洁直观的写法。

      被 @property 装饰的方法是获取属性值的方法,被装饰方法的名字会被用做 属性名。

      被 @属性名.setter 装饰的方法是设置属性值的方法。

      被 @属性名.deleter 装饰的方法是删除属性值的方法。

      以下示例代码与使用 property() 函数版本的代码等价:

    class Student:
        def __init__(self):
            self._age = None
    
        @property
        def age(self):
        print('获取属性时执行的代码')
        return self._age
    
        @age.setter
        def age(self, age):
            print('设置属性时执行的代码')
            self._age = age
    
        @age.deleter
        def age(self):
            print('删除属性时执行的代码')
            del self._age
    
    
    student = Student()
    
    # 设置属性
    student.age = 18
    """
    设置属性时执行的代码
    """
    
    # 获取属性
    print('学生年龄为:' + str(student.age))
    """
    获取属性时执行的代码
    学生年龄为:18
    """
    
    # 删除属性
    del student.age
    """
    删除属性时执行的代码
    """    

    4. 注意事项

      可以省略设置属性值的方法,此时该属性变成只读属性。如果此时仍然设置属性,会抛出异常 AttributeError: can't set attribute。

      如果报错 RecursionError: maximum recursion depth exceeded while calling a Python object,很可能是对象属性名和 @property 装饰的方法名重名了,一般会在对象属性名前加一个下划线 _ 避免重名,并且表明这是一个受保护的属性。

    ————————————————————————————————————————————————————————
    版权声明:本文为CSDN博主「团子大圆帅」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/jpch89/java/article/details/84026130

    ================================================================================================

  • 相关阅读:
    智能推荐算法演变及学习笔记(三):CTR预估模型综述
    从中国农业银行“雅典娜杯”数据挖掘大赛看金融行业数据分析与建模方法
    智能推荐算法演变及学习笔记(二):基于图模型的智能推荐(含知识图谱/图神经网络)
    (设计模式专题3)模板方法模式
    (设计模式专题2)策略模式
    (设计模式专题1)为什么要使用设计模式?
    关于macOS上常用操作命令(持续更新)
    记录下关于RabbitMQ常用知识点(持续更新)
    EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
    SpringCloud教程二:Ribbon(Finchley版)
  • 原文地址:https://www.cnblogs.com/SBJBA/p/12631796.html
Copyright © 2011-2022 走看看