@property 是 Python 中用于类定义时的装饰器
在使用 Python 的内建 property 函数创建只读、只写或读写属性的场景。这个装饰器允许你将方法作为类的属性来访问,从而提供了一种更直观、更符合面向对象编程原则的方式来访问类的数据。
基本用法
@property 通常与三个特殊的装饰器一起使用:@property 本身、@property.setter 和 @property.deleter。
- 只读属性:
使用 @property 装饰器。
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
circle = Circle(5)
print(circle.radius) # 输出: 5
# 尝试修改 circle.radius 会失败,因为它是一个只读属性
# circle._radius=10
# print(circle._radius)
# print(circle.radius) #有漏洞?并不是100%不能改。
-读写属性:
使用 @property 和 @property.setter 装饰器。
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if value < 0:
raise ValueError("Radius cannot be negative!")
self._radius = value
circle = Circle(5)
print(circle.radius) # 输出: 5
circle.radius = 10
print(circle.radius) # 输出: 10
# 尝试将 circle.radius 设置为负数会触发 ValueError
-删除属性(可选):
使用 @property.deleter 装饰器。
class Circle:
# ... 省略其他代码 ...
@radius.deleter
def radius(self):
del self._radius
circle = Circle(5)
print(circle.radius) # 输出: 5
del circle.radius
# 尝试访问 circle.radius 会触发 AttributeError
知识检查
- 使用 _ 前缀的变量(如 self._radius)是一种约定俗成的做法,用于表示这是一个“私有”变量,但 Python 并没有真正的私有变量。这种命名约定仅仅是为了告诉其他开发者不要直接访问或修改这个变量。
- 使用 @property 装饰器可以让你的类更加符合面向对象编程的原则,因为它允许你控制对数据的访问和修改方式。
- 在使用 @property 时,要注意不要与类中的其他方法或属性名冲突。