@property 是 Python 中实现属性封装的核心机制,支持通过装饰器定义只读属性、@xxx.setter 实现赋值校验、@xxx.deleter 处理删除操作,并可用 property() 函数动态构建。

Python 中的 @property 是控制属性访问的核心机制,它让方法像属性一样被调用,同时支持自定义获取、设置和删除逻辑,是实现封装与数据校验的关键工具。
用 @property 替代 getter 方法
传统类中常通过 get_xxx() 方法读取私有属性,但这样调用不自然。@property 可将方法“伪装”成普通属性,直接用 obj.xxx 访问,背后却能执行计算或校验逻辑。
- 在方法上方加
@property装饰器,该方法就变成只读属性 - 方法名即为属性名,外部调用时无需括号
- 适合用于派生值(如面积、全名)、缓存计算、或对底层字段做统一读取处理
用 @xxx.setter 定义可写逻辑
仅用 @property 创建的是只读属性。要支持赋值,需配套定义同名的 @xxx.setter 方法,它会在 obj.xxx = value 时自动触发。
- setter 方法必须与 property 方法同名,且接收一个额外参数(新值)
- 可在 setter 中加入类型检查、范围限制、格式标准化等逻辑
- 例如:限制年龄为 0–150 的整数,或自动将邮箱转为小写再存储
用 @xxx.deleter 处理属性删除
当需要拦截 del obj.xxx 操作时,可添加 @xxx.deleter 方法。它不常用,但在清理资源、重置状态或禁止删除时很实用。
立即学习“Python免费学习笔记(深入)”;
- deleter 方法同样与 property 同名,无返回值
- 可用于清除缓存、关闭关联连接、或抛出异常阻止误删
- 注意:没有 deleter 时,尝试
del会报AttributeError
property 函数:动态构建的替代写法
装饰器写法更常见,但 property() 函数也完全可用,尤其适合运行时动态生成属性,或兼容旧代码风格。
- 语法:
attr = property(fget, fset, fdel, doc) - 四个参数分别对应 getter、setter、deleter 和文档字符串,均可为
None - 本质与装饰器等价,只是写法更显式,可读性略低但灵活性略高










