前言:半夜了好累啊,今天就這樣二零休息休息早上想早點起來!!!
Python內置的@property裝飾器就是負責把一個方法變成屬性調用的,而@property真正強大的是可以限制屬性的定義
class User(object):
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if not isinstance(value, int):
raise ValueError('age must be an integer!')
if value < 0 or value > 100:
raise ValueError('age must between 0 ~ 100!')
self._age = value
把一個getter方法變成屬性,只需要加上@property就可以了,此時,@property本身又創建了另一個裝飾器@score.setter,負責把一個setter方法變成屬性賦值,於是,我們就擁有一個可控的屬性操作:當然我們還可以定義只讀屬性,只定義getter方法,不定義setter方法就是一個只讀屬性:
from datetime import date, datetime
class User:
def __init__(self, name, birthday):
self.name = name
self.birthday = birthday
self._age = 0
@property
def age(self):
return datetime.now().year - self.birthday.year
if __name__ == "__main__":
user = User("bobby", date(year=1987, month=1, day=1))
user.age = 30
報錯:
user.age = 30
AttributeError: can't set attribute