Python 类装饰器
一、较常用的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
发表评论