Python @property 装饰器
方法名一致性: 只读属性:使用
发布日期:2025-06-18 17:25:38
浏览次数:3
分类:精选文章
本文共 2305 字,大约阅读时间需要 7 分钟。
Python 属性管理讲解
1. property() 函数讲解
property() 是 Python 内置的一个高级函数,用于创建托管属性。它允许我们将属性的访问、设置和删除操作封装到类中,通过托管属性在类外实现对这些操作的控制。
property() 函数的参数说明
- fget:获取属性值的函数,默认为
None。 - fset:设置属性值的函数,默认为
None。 - fdel:删除属性值的函数,默认为
None。 - doc:属性的文档字符串,若不提供,默认将使用
fget的文档字符串。
property() 函数的作用
property() 函数的主要作用是将类中的属性进行封装管理。通过定义 fget、fset 和 fdel 三个方法,可以对属性的访问、设置和删除进行过滤或其他处理逻辑。
托管哪些东西?
- 获取属性值:通过
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 装饰器的本质是将装饰的方法转换为一个托管属性。装饰后的属性具备 fget、fset 和 fdel 三个属性,分别对应原方法的逻辑。要想实现属性的设置和删除操作,可以通过定义 @property.setter 和 @property.deleter 装饰器来添加对应的 setter 和 deleter 方法。
注意事项
@property、@score_x.setter、@score_x.deleter 装饰的方法名必须一致,否则会导致错误。@property 装饰的属性默认是只读属性,无法通过赋值操作修改其值。通过 property() 函数和 @property 装饰器,我们可以对类中的属性进行统一管理和封装,从而在类外以简洁的方式实现属性的访问、设置和删除,同时在类中对这些操作进行定制化处理。
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2026年06月14日 00时16分11秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!