Python@property
时间: 2025-06-09 17:27:30 浏览: 8
### Python中`@property`装饰器的用法和实现方式
#### 1. `@property`装饰器的基本概念
`@property`装饰器用于将类中的方法转换为只读属性[^1]。通过这种方式,可以像访问普通属性一样调用方法,而无需显式地使用括号。
#### 2. 使用`@property`创建只读属性
以下是一个示例,展示如何使用`@property`装饰器创建只读属性:
```python
class Human(object):
def __init__(self, value):
self._age = value
@property
def age(self):
return self._age
if __name__ == '__main__':
peter = Human(18)
print("The age of Peter is {}".format(peter.age)) # 输出:The age of Peter is 18
# peter.age = 20 # 如果尝试修改age属性,将会抛出 AttributeError
```
在此示例中,`age`方法被`@property`装饰器修饰后,可以通过`peter.age`的方式访问,而无需使用`peter.age()`的形式[^1]。
#### 3. 使用`@property`实现可写属性
除了创建只读属性外,`@property`还可以与`@<attribute>.setter`结合使用,以实现可写属性。以下是一个示例:
```python
class Human(object):
def __init__(self, value):
self._age = value
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if value < 0:
raise ValueError("Age cannot be negative")
self._age = value
if __name__ == '__main__':
peter = Human(18)
print("The age of Peter is {}".format(peter.age)) # 输出:The age of Peter is 18
peter.age = 25 # 修改年龄
print("The new age of Peter is {}".format(peter.age)) # 输出:The new age of Peter is 25
# peter.age = -5 # 尝试设置负值将抛出 ValueError
```
在此示例中,`@age.setter`定义了`age`属性的设置逻辑,确保只能设置非负值[^1]。
#### 4. 使用`@property`实现删除属性功能
通过`@<attribute>.deleter`,可以定义删除属性时的行为。以下是一个示例:
```python
class Human(object):
def __init__(self, value):
self._age = value
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if value < 0:
raise ValueError("Age cannot be negative")
self._age = value
@age.deleter
def age(self):
del self._age
if __name__ == '__main__':
peter = Human(18)
print("The age of Peter is {}".format(peter.age)) # 输出:The age of Peter is 18
del peter.age # 删除 age 属性
# print(peter.age) # 尝试访问已删除的属性将抛出 AttributeError
```
在此示例中,`@age.deleter`定义了删除`age`属性时的行为[^1]。
#### 5. `@property`装饰器的实现原理
`@property`装饰器本质上是一个描述符(descriptor),它通过重载`__get__`、`__set__`和`__delete__`方法来实现对属性的访问控制。当一个方法被`@property`装饰时,它会被替换为一个`property`对象,该对象管理对底层私有属性的访问[^1]。
以下是一个简单的`property`实现示例:
```python
class Property:
def __init__(self, fget=None, fset=None, fdel=None):
self.fget = fget
self.fset = fset
self.fdel = fdel
def __get__(self, instance, owner):
if instance is None:
return self
if self.fget is None:
raise AttributeError("unreadable attribute")
return self.fget(instance)
def __set__(self, instance, value):
if self.fset is None:
raise AttributeError("can't set attribute")
self.fset(instance, value)
def __delete__(self, instance):
if self.fdel is None:
raise AttributeError("can't delete attribute")
self.fdel(instance)
```
在这个实现中,`Property`类通过`__get__`、`__set__`和`__delete__`方法分别实现了对属性的获取、设置和删除操作[^1]。
---
###
阅读全文
相关推荐












