Python 类装饰器

  • 2020-04-05
  • 2,502
  • 0

一、较常用的Python的类装饰器

用于限制修改或者访问类中特定的变量

class Student:
    def __init__(self, name, score):
        self.name = name
        self.__score = score


if __name__ == '__main__':
    s = Student('李四', '100')
    print(s.name)
    print(s.__score)

结果:

李四
Traceback (most recent call last):
  File "C:/Users/ASUS/Desktop/cls_decorator.py", line 10, in <module>
    print(s.__score)
AttributeError: 'Student' object has no attribute '__score'

因为以 __xxx命名的属性属于隐性属性,在外部不允许访问,所以报错了。但是我们可以利用特定的装饰器,使其可以访问。

class Student:
    def __init__(self, name, score):
        self.name = name
        self.__score = score

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


if __name__ == '__main__':
    s = Student('李四', '100')
    print(s.name)
    print(s.score)

结果:

李四
100

@property 使得装饰函数变成类的一个属性 score方法就变成了了 名为score的属性。那么想进一步修改score的大小呢?

if __name__ == '__main__':
    s = Student('李四', '100')
    print(s.name)
    s.score = 100
    print(s.score)

结果直接报错:score属性不允许修改。

Traceback (most recent call last):
  File "C:/Users/ASUS/Desktop/cls_decorator.py", line 14, in <module>
    s.score = 100
AttributeError: can't set attribute

装饰器实现的属性,想要修改,当然还是需要装饰器实现。

class Student:
    def __init__(self, name, score):
        self.name = name
        self.__score = score

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

    @score.setter   # 对应属性名.setter
    def score(self, score):    # 函数名也必须为对应属性名
        self.__score = score


if __name__ == '__main__':
    s = Student('李四', '100')
    print(s.name)
    s.score = 90
    print(s.score)

结果:修改成功

李四
90

 

评论

还没有任何评论,你来说两句吧

苟活时长: Copyright © 2019-2020 OJO