@property装饰器将方法转为属性访问,实现简洁接口与内部控制的平衡,支持读、写、删的精细化管理,如数据校验和动态计算。

Python中的
@property
要使用
@property
class Circle:
def __init__(self, radius):
# 通常用单下划线前缀表示这是一个“受保护”或内部使用的属性
self._radius = radius
@property
def radius(self):
"""返回圆的半径,这是一个只读属性。"""
print("正在获取半径...")
return self._radius
@property
def diameter(self):
"""计算并返回直径,这也是一个只读属性。"""
print("正在计算直径...")
return self._radius * 2
# 使用示例
c = Circle(5)
print(f"圆的半径是: {c.radius}") # 看起来像访问属性,但实际上调用了radius方法
print(f"圆的直径是: {c.diameter}")
# 尝试设置c.radius = 10 会报错:AttributeError: can't set attribute但
@property
@<property_name>.setter
@<property_name>.deleter
class Person:
def __init__(self, name):
self._name = name
self._age = 0
@property
def name(self):
"""获取姓名"""
print("正在获取姓名...")
return self._name
@name.setter
def name(self, value):
"""设置姓名,并进行简单的校验"""
print(f"正在尝试设置姓名为: {value}")
if not isinstance(value, str) or not value.strip():
raise ValueError("姓名必须是非空的字符串!")
self._name = value.strip()
@name.deleter
def name(self):
"""删除姓名(通常不常用,但展示功能)"""
print("正在删除姓名...")
del self._name
# 实际项目中可能更倾向于设置为None或抛出错误,而不是直接删除底层属性
@property
def age(self):
"""获取年龄"""
return self._age
@age.setter
def age(self, value):
"""设置年龄,确保是合理的数值"""
if not isinstance(value, (int, float)) or not (0 <= value < 150):
raise ValueError("年龄必须是0到150之间的数字!")
self._age = int(value) # 强制转换为整数
# 使用示例
p = Person("Alice")
print(f"初始姓名: {p.name}")
p.name = "Bob" # 调用name属性的setter方法
print(f"新姓名: {p.name}")
try:
p.name = 123 # 触发ValueError,因为setter中进行了类型校验
except ValueError as e:
print(f"设置姓名失败: {e}")
try:
p.age = -5 # 触发ValueError,因为setter中进行了范围校验
except ValueError as e:
print(f"设置年龄失败: {e}")
p.age = 30
print(f"年龄: {p.age}")
# del p.name # 调用name属性的deleter方法,会删除_name属性
# print(p.name) # 再次访问会报错AttributeError从本质上讲,
@property
obj.attribute
attribute
@property
__get__
__set__
__delete__
立即学习“Python免费学习笔记(深入)”;
我个人觉得,
@property
get_age()
set_age()
@property
obj.age
_age
以上就是python中怎么使用@property装饰器?的详细内容,更多请关注php中文网其它相关文章!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号