理解 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。