python property装饰器是什么

@property 装饰器用于将方法伪装成属性,实现属性访问时的自定义逻辑。例如,通过 @property 可定义 getter,@name.setter 实现设置时的数据验证,@name.deleter 支持删除操作。使用 property 可在不改变外部接口的情况下,将普通属性升级为带有逻辑控制的属性,提升代码安全性与灵活性。

Python 的 property 装饰器是一种用于控制类中属性访问的方式,它允许你将方法伪装成属性,从而在不改变接口的情况下实现对属性的读取、赋值和删除操作的自定义逻辑。

基本作用

当你有一个属性需要在获取或设置时执行一些额外操作(比如数据验证、类型检查、计算延迟加载等),但又希望保持像访问普通属性一样的简洁语法,就可以使用 @property

例如:

class Person:
    def __init__(self, name):
        self._name = name
@property
def name(self):
    return self._name

@name.setter
def name(self, value):
    if not isinstance(value, str):
        raise TypeError("名字必须是字符串")
    self._name = value

使用示例

p = Person("Alice") print(p.name) # 读取属性,输出: Alice p.name = "Bob" # 设置属性 print(p.name) # 输出: Bob p.name = 123 # 抛出异常:TypeError

三大装饰器

property 实际上支持三个操作,分别对应三种装饰器:

  • @property:定义获取属性值的方法(getter)
  • @属性名.setter:定义设置属性值的方法(setter)
  • @属性名.deleter:定义删除属性的方法(deleter,可选)

完整例子包含删除:

@property
def name(self):
    return self._name

@name.setter def name(self, value): self._name = value

@name.deleter def name(self): del self._name

为什么用 property?

它解决了“从字段到方法”的升级问题。假设你最初直接暴露一个字段:

obj.name

后来你想加入校验逻辑,如果改成方法调用如 obj.get_name(),就会破坏已有代码。而使用 @property,你可以保持 obj.name 的调用方式不变,内部却实现了复杂逻辑。

基本上就这些 —— 它让代码更安全、更灵活,同时保持接口干净。