Python 如何让一个类的方法变成属性且支持删除

2次阅读

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

Python 如何让一个类的方法变成属性且支持删除

在 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 是可选的,按需添加即可。不复杂但容易忽略。

text=ZqhQzanResources