什么是 property()?
在 Python 中,property() 是一个内置函数,用于将类的方法转换为只读或可读写的“属性”。
它提供了一种方式,在不改变接口的前提下,对属性的访问进行拦截和控制,常用于实现数据验证、懒加载、计算属性等。
基本语法
property(fget=None, fset=None, fdel=None, doc=None)
fget:获取属性值的函数(getter)fset:设置属性值的函数(setter)fdel:删除属性的函数(deleter)doc:属性的文档字符串
示例 1:使用 property() 函数
class Circle:
def __init__(self, radius):
self._radius = radius
def get_radius(self):
return self._radius
def set_radius(self, value):
if value < 0:
raise ValueError("半径不能为负数")
self._radius = value
def del_radius(self):
del self._radius
radius = property(get_radius, set_radius, del_radius, "圆的半径")
# 使用
c = Circle(5)
print(c.radius) # 调用 get_radius()
c.radius = 10 # 调用 set_radius()
del c.radius # 调用 del_radius()
示例 2:使用 @property 装饰器(更常用)
class Rectangle:
def __init__(self, width, height):
self._width = width
self._height = height
@property
def area(self):
"""计算矩形面积"""
return self._width * self._height
@property
def width(self):
return self._width
@width.setter
def width(self, value):
if value <= 0:
raise ValueError("宽度必须大于0")
self._width = value
# 使用
r = Rectangle(4, 5)
print(r.area) # 20
r.width = 6 # 触发 setter
print(r.area) # 30
为什么使用 property?
- 保持接口一致性:未来即使需要添加逻辑,调用方式不变(仍用
obj.attr) - 封装与数据验证:防止非法赋值
- 支持只读属性:仅定义 getter 即可
- 符合 Python 的“显式优于隐式”哲学
常见应用场景
- 输入验证(如年龄、价格等不能为负)
- 懒加载(延迟计算昂贵的属性)
- 缓存计算结果
- 日志记录或调试(在访问属性时打印信息)