property

@property可以将python定义的方法“当做”属性访问(不用添加()直接类实例.方法名),从而提供更加友好访问方式,但是有时候setter/deleter也是需要的。

  • 只有@property表示只读。
  • 同时有@property和@被装饰的方法名.setter表示可读可写。
  • 同时有@property和@被装饰的方法名.setter和@被装饰的方法名.deleter表示可读可写可删除
    class Person():
        def __init__(self):
            self._age = None
        @property
        def get_age(self):
            return self._age
        @get_age.setter
        def set_age(self,age):
            self._age = age
    if __name__ == "__main__":
        p1=Person()
        p1.set_age=23
        print(p1.get_age) #23
         print(p1.age)#报错没有age属性,这里装饰过后 只能通过p1.get_age获取到age属性 所以一般我们命名用以下方法
    #不过一般我们不用上述那种命名,直接用属性名字定义方法名
    class Student():
        def __init__(self):
            self._score = None
        @property
        def score(self):
            return self._score
        @score.setter
        def score(self,value):
            ####   这里可以加入赋值逻辑
            if not isinstance(value,int):
                raise ValueError('分数必须为整数')
            if value>100 or value<0:
                raise ValueError('分数不是合理区间')
            else:
                self._score = value
        @score.deleter
        def score(self):
            del self._score
    if __name__ == "__main__":
        stu1 = Student()
        stu1.score = 100
        print(stu1.score)
    del stu1.score
    print(stu1.score)#报错stu1没有score该属性 stu1.score
    = 101#报错分数不是合理区间

    如果不加@x.setter表示该属性为只读

  • class Person():
        def __init__(self):
            self._age = 26
        @property
        def age(self):
            return self._age
     
    if __name__ == "__main__":
        p1 = Person()
        print(p1.age)
        p1.age=27   #报错 AttributeError: can't set attribute

     

print(stu1.score)
posted @ 2020-09-11 17:51  Alantammm  阅读(393)  评论(0编辑  收藏  举报