博客
关于我
Python @property 装饰器
阅读量:798 次
发布时间:2023-04-15

本文共 2305 字,大约阅读时间需要 7 分钟。

Python 属性管理讲解

1. property() 函数讲解

property() 是 Python 内置的一个高级函数,用于创建托管属性。它允许我们将属性的访问、设置和删除操作封装到类中,通过托管属性在类外实现对这些操作的控制。

property() 函数的参数说明
  • fget:获取属性值的函数,默认为 None
  • fset:设置属性值的函数,默认为 None
  • fdel:删除属性值的函数,默认为 None
  • doc:属性的文档字符串,若不提供,默认将使用 fget 的文档字符串。
property() 函数的作用

property() 函数的主要作用是将类中的属性进行封装管理。通过定义 fgetfsetfdel 三个方法,可以对属性的访问、设置和删除进行过滤或其他处理逻辑。

托管哪些东西?
  • 获取属性值:通过 fget 函数定义的逻辑获取属性值。
  • 设置属性值:通过 fset 函数定义的逻辑设置属性值。
  • 删除属性值:通过 fdel 函数定义的逻辑删除属性值。
类外使用托管属性与直接使用属性的区别
  • 灵活性:托管属性可以在类外通过简洁的方式实现对属性的访问、设置和删除,同时在类中对这些操作进行过滤或其他处理。
  • 多属性管理:可以通过托管属性对类中的多个属性同时实现统一的管理方式。
示例:定义一个托管属性 X
class C:    def __init__(self):        self._x = None  # 初始化隐藏属性    def getx(self):  # 获取x的值        return self._x    def setx(self, value):  # 设置x的值        self._x = value    def delx(self):  # 删除x的值        del self._x        print("已删除 _x")    # 创建托管属性 x    x = property(getx, setx, delx, 'x 是一个托管属性')c = C()  # 创建实例对象# 通过实例对象设置托管属性 xc.x = "Property"# 调用 getx() 获取 x 的值print(c.x)  # 输出 "Property"# 调用 __doc__ 查看托管属性的文档print(C.x.__doc__)  # 输出 "x 是一个托管属性"# 删除托管属性 xdel c.x  # 调用 delx() 方法
运行结果
Property已删除 _x

2. @property 装饰器讲解

@property 是一个装饰器,用于将方法转换为属性。通过使用 @property 装饰器,可以将类中的方法转化为属性,从而在类外通过属性访问、设置和删除这些逻辑。

示例:定义一个带过滤条件的属性
class A:    def __init__(self):        self.score = 85  # 初始化分数    def get_score(self):  # 获取分数        if self.score < 60:            return "不及格!"        else:            return self.score    def set_score(self, value):  # 设置分数        if 0 <= value <= 100:            self.score = value        else:            print(f"输入的值 {value} 超出范围0~100!")    def del_score(self):  # 删除分数        del self.score        print("已删除 score 的值")    score_x = property(        fget=get_score,        fset=set_score,        fdel=del_score,        doc="score_x 是 score 的托管属性"    )a = A()# 通过实例对象设置托管属性 score_xa.score_x = 45# 调用 get_score() 获取 score_x 的值print(a.score_x)  # 输出 "不及格!"# 删除托管属性 score_xdel a.score_x
运行结果
不及格!已删除 score 的值
@property 装饰器的本质

@property 装饰器的本质是将装饰的方法转换为一个托管属性。装饰后的属性具备 fgetfsetfdel 三个属性,分别对应原方法的逻辑。要想实现属性的设置和删除操作,可以通过定义 @property.setter@property.deleter 装饰器来添加对应的 setter 和 deleter 方法。

注意事项
  • 方法名一致性@property@score_x.setter@score_x.deleter 装饰的方法名必须一致,否则会导致错误。
  • 只读属性:使用 @property 装饰的属性默认是只读属性,无法通过赋值操作修改其值。
  • 通过 property() 函数和 @property 装饰器,我们可以对类中的属性进行统一管理和封装,从而在类外以简洁的方式实现属性的访问、设置和删除,同时在类中对这些操作进行定制化处理。

    转载地址:http://uzgfk.baihongyu.com/

    你可能感兴趣的文章