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

@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, radiu

s): 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 删除对应状态(比如清空缓存、重置私有变量等):

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