@property 可将方法转为只读属性,配合 @xxx.setter 和 @xxx.deleter 可支持赋值与删除;三者方法名须一致,@property 必须最先定义。

在 Python 中,可以通过 @property 装饰器将方法变成只读属性;若还需支持赋值和删除,则需配合 @xxx.setter 和 @xxx.deleter 一起使用。
用 @property 把方法变成可读属性
只需在方法前加 @property,调用时就无需括号,像访问普通属性一样:
class Circle: def __init__(self, radius): self._radius = radius @property def area(self): return 3.14159 * self._radius ** 2
c = Circle(5) print(c.area) # 输出:78.53975,不加括号
加上 @xxx.setter 支持赋值
定义同名的 setter 方法,就能通过 = 修改属性(内部通常更新私有变量):
class Circle: def __init__(self, radius): self._radius = radius @property def radius(self): return self._radius @radius.setter def radius(self, value): if value <0: raise ValueError("半径不能为负") self._radius = value
c = Circle(5) c.radius = 10 # 触发 setter print(c.radius) # 输出:10
加上 @xxx.deleter 支持 del 删除
定义同名 deleter 方法,就能用 del obj.attr 删除对应状态(比如清空缓存、重置私有变量等):
立即学习 “Python 免费学习笔记(深入)”;
class Circle: def __init__(self, radius): self._radius = radius self._area_cache = None @property def area(self): if self._area_cache is None: self._area_cache = 3.14159 * self._radius ** 2 return self._area_cache @area.deleter def area(self): self._area_cache = None # 删除时清空缓存
c = Circle(5) print(c.area) # 第一次计算并缓存 del c.area # 触发 deleter,清空缓存 print(c.area) # 再次访问会重新计算
注意:三个方法名必须完全一致(如都叫 area),且 @property 必须最先定义;setter 和 deleter 是可选的,按需添加即可。不复杂但容易忽略。






























