@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 ** 2c = 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 = valuec = 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 是可选的,按需添加即可。不复杂但容易忽略。










