Python的内置函数property
已于 2025年02月24日 20:11 修改
访问次数:12
在 Python 中,property 是一个内置函数,用于将类中的方法(通常是 getter 和 setter)包装成属性,使得调用这些方法时不需要显式地调用它们,而是像访问普通属性一样访问它们。这通常用于控制对类属性的访问,添加一些额外的逻辑或验证。
property() 函数的基本用法
property() 是一个内置函数,它通常接收四个参数:
- fget:获取属性的函数(getter)。
- fset:设置属性的函数(setter)。
- fdel:删除属性的函数(deleter)。
- doc:属性的文档字符串。
简单示例
示例 1: 使用 property 实现 getter 和 setter
class Circle:
def __init__(self, radius):
self._radius = radius
# getter 方法
@property
def radius(self):
return self._radius
# setter 方法
@radius.setter
def radius(self, value):
if value < 0:
raise ValueError("Radius cannot be negative")
self._radius = value
# deleter 方法
@radius.deleter
def radius(self):
print("Deleting radius")
del self._radius
# 创建实例
circle = Circle(5)
print(circle.radius) # 通过 property 调用 getter,输出: 5
# 设置属性,调用 setter
circle.radius = 10
print(circle.radius) # 输出: 10
# 尝试设置非法值
try:
circle.radius = -5 # 触发 ValueError
except ValueError as e:
print(e) # 输出: Radius cannot be negative
# 删除属性,调用 deleter
del circle.radius # 输出: Deleting radius
解释:
@property:这将radius方法转换为一个只读属性(getter)。你可以像访问普通属性一样访问circle.radius,而实际上它会调用radius()方法。@radius.setter:这个装饰器为radius属性添加了一个 setter 方法,这样你可以在修改circle.radius时进行检查或修改。@radius.deleter:这个装饰器定义了删除属性时调用的方法。
示例 2: property() 使用方式
你还可以直接使用 property() 函数来创建 getter、setter 和 deleter 方法。
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("Radius cannot be negative")
self._radius = value
def del_radius(self):
print("Deleting radius")
del self._radius
# 使用 property() 函数
radius = property(get_radius, set_radius, del_radius)
# 创建实例
circle = Circle(5)
print(circle.radius) # 通过 property 调用 getter,输出: 5
# 设置属性,调用 setter
circle.radius = 10
print(circle.radius) # 输出: 10
# 删除属性,调用 deleter
del circle.radius # 输出: Deleting radius
总结:
property让你能够以类似属性的方式访问方法,并提供额外的控制逻辑(如验证和删除操作)。- 使用
@property可以定义只读属性,@property.setter可以定义可写属性,@property.deleter可以定义删除属性的行为。 property()函数也可以手动创建 getter、setter 和 deleter,但通常使用装饰器方式更加简洁。
这种方式使得你的代码更具封装性和灵活性,尤其是当你需要在设置或获取属性时添加额外逻辑时非常有用。
评论(0)