理解 Python 中的 @property 装饰器

什么是 @property 装饰器?

@property 是 Python 提供的一种用于将类中的方法转换为只读属性的装饰器。它允许我们像访问普通属性一样访问方法的结果,隐藏了方法的调用细节,同时保留了通过方法控制属性访问的能力。

为什么使用 @property?

使用 @property,可以让我们在保持简洁语法的同时,定义受控的属性访问行为。它的主要作用包括:

  • 隐藏内部实现细节:外部代码可以通过属性访问方法获取结果,而无需知道背后的计算逻辑。
  • 数据验证:可以在设置属性时进行验证,确保数据的合法性。
  • 只读属性:可以定义只能读取、不能修改的属性。

@property 的用法

@property 装饰器的基本使用方法如下:

class MyClass:
    def __init__(self, name):
        self._name = name  # 使用下划线表示私有属性

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

# 创建实例并访问属性
obj = MyClass("Alice")
print(obj.name)  # 输出: Alice

定义 setter 和 deleter

@property 不仅可以定义 getter,还可以结合 @setter 和 @deleter 来定义 setter 和删除属性的行为。

class MyClass:
    def __init__(self, name):
        self._name = name

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

    @name.setter
    def name(self, value):
        if len(value) < 3:
            raise ValueError("Name must be at least 3 characters long.")
        self._name = value

    @name.deleter
    def name(self):
        print("Deleting name...")
        del self._name

# 创建实例并操作属性
obj = MyClass("Alice")
obj.name = "Bob"  # 正常修改
# obj.name = "Al"  # ValueError: Name must be at least 3 characters long.
del obj.name      # 删除属性

在这个例子中:

  • @name.setter 定义了在设置 name 属性时的行为。我们在 setter 中增加了一个验证逻辑,确保名字长度不能少于 3
    个字符。
  • @name.deleter 定义了删除 name 属性时的行为。在这里,删除时会打印一条信息并删除内部的 _name 属性。

只读属性

如果我们只定义 @property 而不定义 @setter,则可以创建一个只读属性。这种属性可以被访问,但不能被修改。

class MyClass:
    def __init__(self, name):
        self._name = name

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

# 创建只读属性
obj = MyClass("Alice")
print(obj.name)  # 输出: Alice
# obj.name = "Bob"  # AttributeError: can't set attribute

在这个例子中,name 是一个只读属性,任何对它的赋值操作都会引发 AttributeError。

猜你喜欢

转载自blog.csdn.net/summerriver1/article/details/142728797