python @property 设置只读属性 重写 gette

2017-08-29  本文已影响0人  wangtieshan

做过 iOS OC 开发的都知道

@property NSString * name;

拥有该属性 name 的类的实例对象都可以使用 .(点) 方法设置和获取name


s.name = "xiaoming"

print(s.name);

>>> xiaoming

同时在 .m 文件中可以重写 name 的 getset 方法

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

上一篇 下一篇

猜你喜欢

热点阅读