python @property 设置只读属性 重写 getter setter 方法

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,646评论 19 139
  • 20- 枚举,枚举原始值,枚举相关值,switch提取枚举关联值 Swift枚举: Swift中的枚举比OC中的枚...
    iOS_恒仔阅读 6,859评论 1 6
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,989评论 18 399
  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 5,511评论 0 6
  • 相遇,在那一刹那间点燃, 相识,在岁月的长廊中越来越浓, 人生弥散在缘与缘之间。 不是每个擦肩过的人都会相识, 不...
    早茶的月光阅读 3,034评论 11 7