Python内置装饰器@property(2)


复制代码
 1 """
 2 ------------------------------------
 3 @Time : 2019/7/4 20:57
 4 @Auth : linux超
 5 @File : python_property.py
 6 @IDE  : PyCharm
 7 @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
 8 @QQ  : 28174043@qq.com
 9 @GROUP: 878565760
10 ------------------------------------
11 """
12
13
14 class UserInfo(object):
15
16    def __init__(self, name, age):
17        self.__name = name
18        self.__age = age
19
20 if __name__ == '__main__':
21    user = UserInfo('linux超', 18)
22    print(user.__name)

复制代码

执行结果


复制代码
Traceback (most recent call last):
  File "D:/LingMengPython16/LingMengPython16/cnblogs/python_property.py", line 22, in <module>
    print(user.__name)
AttributeError: 'UserInfo' object has no attribute '__name'

Process finished with exit code 1

复制代码

没错,程序是没办法运行成功的,因为python不允许你在类的外部访问类中的私有成员,这么做其实是为了保护数据的安全性

那么这时候我们也可以使用@property装饰器来访问类的属性


复制代码
 1 """
 2 ------------------------------------
 3 @Time : 2019/7/4 20:57
 4 @Auth : linux超
 5 @File : python_property.py
 6 @IDE  : PyCharm
 7 @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
 8 @QQ  : 28174043@qq.com
 9 @GROUP: 878565760
10 ------------------------------------
11 """
12
13
14 class UserInfo(object):
15
16    def __init__(self, name):
17        self.__name = name
18
19    @property
20    def name(self):
21        """通过类的方法访问类中的私有属性"""
22        return self.__name
23
24 if __name__ == '__main__':
25    user = UserInfo('linux超')
26    print("获取name属性:", user.name)

复制代码

执行结果

获取name属性: linux超

Process finished with exit code 0

这样就能访问类的私有成员属性了

那么其实我个人认为,相对于绑定属性来说这种方式用的比较多,当你不想子类继承父类时,防止子类修改父类的属性,那么你完全就可以使用这种方法来避免属性被修改,而且在子类和类的外部还可以正常访问这个私有属性

总结

@property装饰器主要用来改变一个方法为一个属性,且需要注意几点

1. 被此装饰器装饰的方法不能传递任何除self外的其他参数

2.当同时使用@property和@x.setter时 需要保证x以及被@x.setter修改的方法名字与@property修改的方法名字必须保持一致

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7363dc536b2bc88527a6278257be7d37.html