内置装饰器二:@property
2024-08-25 20:12:46
property 装饰器的作用
property 装饰器将方法包装成属性,将私有属性公有化,此属性只能被读取。相当于实现get方法的对象
class People:
def __init__(self, identity_number):
self._identity_number = identity_number
@property # 只读
def age(self):
return self._age
@age.setter # 写
def age(self, value):
if not isinstance(value, int):
raise ValueError("age must be an integer!")
if value < 0:
raise ValueError("age must more than 0")
self._age = value
@age.deleter # 删除
def age(self):
del self._age
@property
def get_identity_number(self):
return self._identity_number
#In [22]: p = People(123456)
#In [23]: p.age = 18
# In [24]: p.age
# Out[24]: 18
# In [25]: del p.age
# In [26]: p.age
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-26-3523b116dc0e> in <module>()
----> 1 p.age
<ipython-input-21-de21f31a52ce> in age(self)
5 @property # 只读
6 def age(self):
----> 7 return self._age
8
9 @age.setter # 写
AttributeError: 'People' object has no attribute '_age'
# In [27]: p.age = 18
# In [28]: p.age = 18.6
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-28-8a03211dcd49> in <module>()
----> 1 p.age = 18.6
<ipython-input-21-de21f31a52ce> in age(self, value)
10 def age(self, value):
11 if not isinstance(value, int):
---> 12 raise ValueError("age must be an integer!")
13 if value < 0:
14 raise ValueError("age must more than 0")
ValueError: age must be an integer!
# In [29]: p.age = '11'
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-29-b6d20eff2848> in <module>()
----> 1 p.age = '11'
<ipython-input-21-de21f31a52ce> in age(self, value)
10 def age(self, value):
11 if not isinstance(value, int):
---> 12 raise ValueError("age must be an integer!")
13 if value < 0:
14 raise ValueError("age must more than 0")
ValueError: age must be an integer!
# In [30]: p.age = -1
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-30-47db6d5817ed> in <module>()
----> 1 p.age = -1
<ipython-input-21-de21f31a52ce> in age(self, value)
12 raise ValueError("age must be an integer!")
13 if value < 0:
---> 14 raise ValueError("age must more than 0")
15 self._age = value
16
ValueError: age must more than 0
# In [31]:
会把成员函数x转换为getter,相当于做了x = property(); x = x.getter(x_get)
- @property表示只读。
- 同时有@property和@x.setter表示可读可写。
- 同时有@property和@x.setter和@x.deleter表示可读可写可删除。
参考资料:https://docs.python.org/3/library/functions.html?highlight=property#property
http://blog.willdx.me/web/面向对象进阶.html
最新文章
- 创建widget
- Skeljs – 用于构建响应式网站的前端开发框架
- 01 HTML基础
- BizTalk开发系列(四) 深入Map测试
- Extjs Form用法详解(适用于Extjs5)
- POJ2112 Optimal Milking(最大流)
- UEFI双硬盘安装win8.1和Ubuntu14.04
- PL/pgSQL RETURNS TABLE 例子
- 使用JAVA反射初始化数组(转)
- 【Android - 框架】之ORMLite的使用
- Java类加载器详解
- js基础语法习题补充
- Java多线程高并发学习笔记——阻塞队列
- Mysql性能优化之覆盖索引
- java 构造方法详解
- sessionFactory中的openSession和getCurrentSession的一些注意事项
- 代码学习-Linux内核网卡收包过程(NAPI)【转】
- CSS3 transform 属性
- Codeforces 985 D - Sand Fortress
- [android] 手机卫士号码归属地查询完成
热门文章
- OpenGLES.gpus_ReturnNotPermittedKillClient
- IG—金字塔
- htons、htonl与字节序大小端
- 2018.10.12 NOIP模拟 数据结构(线段树)
- asp.net 中长尾链接实现推送 -- comet
- 【转】web应用缓慢故障分析
- POJ 3686 The Windy&#39;s (最小费用流或最佳完全匹配)
- Swift要点:从Objective-C开发者的角度看Swift
- 记spring mvc传入List<;Object>;的一次尝试
- (并查集)小希的迷宫 --HDU -- 1272