使用property

有没有既能检查参数,又可以用类似属性这样简单的方式来访问类的变量呢?
Python内置的@property装饰器就是负责把一个方法变成属性调用的:

class Student(object):

    @property
    def score(self):
        return self._score

    @score.setter
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value

## 测试
>>> s = Student()
>>> s.score = 60 # OK,实际转化为s.set_score(60)
>>> s.score # OK,实际转化为s.get_score()
60
>>> s.score = 9999
Traceback (most recent call last):
  ...
ValueError: score must between 0 ~ 100!

还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性:

class Student(object):

    @property
    def birth(self):
        return self._birth

    @birth.setter
    def birth(self, value):
        self._birth = value

    @property
    def age(self):
        return 2015 - self._birth

上面的birth是可读写属性,而age就是一个只读属性,因为age可以根据birth和当前时间计算出来。

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

推荐阅读更多精彩内容

  • 使用@property:(首先,这个一般是放在类里边,其次这个放在类内函数之上) 既能检查参数(就是通过get()...
    黄大臻Dzreal阅读 227评论 0 0
  • 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: 这显然不...
    劉光軍_MVP阅读 432评论 0 1
  • 作为一个初入职场的新人,如果没有职场老鸟的指引,是很容易踩到雷区的。结合自己多年的职场经验,来总结下作为职场新人你...
    0756cb9cf0ae阅读 475评论 0 0
  • 前世, 我为青莲,你为梵音, 一眸擦肩,惊艳了五百年的时光。 花绵绵而绽,音靡靡而绕, 低眉含笑间, 谁的深情绚烂...
    暮羽白阅读 367评论 0 0
  • 昨天讲了一些日语的常用数量词及其读音,今天讲一下关于日语数量词的基本用法。 日语的数量词在句子中有两种基本用法,一...
    不帅任你踹阅读 12,098评论 10 21