做过 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 方法,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。