做過 iOS OC 開發的都知道
@property NSString * name;
擁有該屬性 name 的類的實例對象都可以使用 .(點) 方法設置和獲取name
s.name = "xiaoming"
print(s.name);
>>> xiaoming
同時在 .m 文件中可以重寫 name 的 get 和 set 方法
- (NSString*)name {
return _name;
}
- (void)setName:(NSString *)name {
// 此處可以對name做一些校驗和處理
_name = name
}
同樣 python 中也可以實現這種 set get
同樣是使用 @property 修飾
class Student(object):
# get 方法采用 @property 修飾
@property
def score(self):
return self._score
# set 方法采用 屬性名稱.setter 修飾
@score.setter
def score(self, value):
if not isinstance(value, int):
raise ValueError('score must be integer!')
if value < 0 or value > 100:
raise ValueError('score must between 0 - 100!')
self._score = value
s = Student()
s.score = 100
print(s.score)
我們在 score 的 setter 方法中做了一些校驗
如果我們只需要 get 方法怎么做
只需要使用 @property 聲明 get 方法即可
class Frame(object):
__slots__ = ('x', 'y', 'width', 'height')
@property
def size(self):
return (self.width, self.height);
f = Frame()
f.x = 0
f.y = 0
f.width = 100
f.height = 200
print(f.size)
>>> (100, 200)
小結
@property廣泛應用在類的定義中,可以讓調用者寫出簡短的代碼,就可以重寫屬性的 get 和 set 方法,同時保證對參數進行必要的檢查,這樣,程序運行時就減少了出錯的可能性。