python中property和setter
时间: 2023-09-21 13:10:11 浏览: 88
在Python中,property和setter是用于属性访问和修改的特殊装饰器。它们允许您以更简洁和可控的方式定义类的属性。
@property装饰器用于将一个方法转换为类的只读属性。它允许您在访问该属性时执行一些额外的逻辑。例如,假设您有一个Person类,其中有一个birth_year属性,您可以使用@property装饰器来创建一个名为age的只读属性,计算该人的年龄:
```python
class Person:
def __init__(self, birth_year):
self._birth_year = birth_year
@property
def age(self):
current_year = datetime.datetime.now().year
return current_year - self._birth_year
person = Person(1990)
print(person.age) # 输出: 31
```
在上面的示例中,age方法被@property装饰器修饰,使其成为只读属性。每次访问age属性时,它将计算当前年份与出生年份之间的差值,并返回结果。
setter是@property的配套装饰器,用于定义属性的修改行为。通过setter,您可以控制对属性的赋值操作。例如,如果您希望在设置birth_year属性时进行一些验证,您可以使用setter来实现:
```python
class Person:
def __init__(self, birth_year):
self._birth_year = birth_year
@property
def birth_year(self):
return self._birth_year
@birth_year.setter
def birth_year(self, value):
if value < 1900:
raise ValueError("Invalid birth year")
self._birth_year = value
person = Person(1990)
print(person.birth_year) # 输出: 1990
person.birth_year = 2000
print(person.birth_year) # 输出: 2000
person.birth_year = 1800 # 抛出ValueError异常
```
在上面的示例中,birth_year方法被@property装饰器修饰,使其成为只读属性。然后,通过使用birth_year.setter装饰器,定义了一个名为birth_year的setter方法。在setter方法中,我们可以添加自定义的验证逻辑,以确保赋值的值符合我们的要求。
通过@property和setter装饰器,我们可以更方便地控制和验证类属性的访问和修改。
阅读全文