前言
我们可以看一下@property源码中给的实例和解释
复制代码
1 Decorators make defining new properties or modifying existing ones easy:
2
3
4 class C(object):
5 @property
6 def x(self):
7 "I am the 'x' property."
8 return self._x
9
10 @x.setter
11 def x(self, value):
12 self._x = value
13
14 @x.deleter
15 def x(self):
16 del self._x
复制代码
没错,龟叔给的解释就是这个装饰器会把定义新属性和对现有的属性的修改变的更简单,那么传统的方法在绑定属性和访问属性时是什么样的呢?
实例
复制代码
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 get_name(self):
17 """通过类的方法访问类中的属性"""
18 return self.__name
19
20 def set_name(self, name):
21 """通过外部传参的方式绑定属性"""
22 self.__name = name
23
24
25 if __name__ == '__main__':
26 user = UserInfo()
27 # 绑定name属性
28 user.set_name(["超哥", "linux超"])
29 print("我的名字是:", user.get_name())
复制代码
执行结果
我的名字是: [’超哥’, ‘linux超’]
Process finished with exit code 0
这种方式在绑定属性,获取属性时显的很是繁琐,而且无法保证数据的准确性,从执行结果看来,名字应该是个字符串才对,然而输出结果却是个列表,这并不符合实际规则
而且也没有通过直接访问属性,修改属性的方式那么直观
我们对代码稍作改动,并使用@property装饰器来实现
复制代码
1 """
2 ------------------------------------
3 @Time : 2019/7/4 22:02
4 @Auth : linux超
5 @File : python_class.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 @property
16 def name(self):
17 return self.__name
18
19 @name.setter
20 def name(self, name):
21 if isinstance(name, str):
22 self.__name = name
23 else:
24 raise TypeError("The name must be str")
25
26
27 if __name__ == '__main__':
28 user = UserInfo()
29 # 绑定属性
30 user.name = "linux超"
31 print("我的名字是", user.name)
32 user.name = ["linux超", "超哥"]
33 print("我的名字是", user.name)
复制代码
执行结果
复制代码
我的名字是 linux超
Traceback (most recent call last):
File "D:/LingMengPython16/LingMengPython16/cnblogs/python_class.py", line 32, in <module>
user.name = ["linux超", "超哥"]
File "D:/LingMengPython16/LingMengPython16/cnblogs/python_class.py", line 24, in name