Python 装饰器 property() 函数

描述:property() 函数的作用是在新式类中返回属性值。

   @property 装饰器简单理解就是负责把一个方法变成属性调用

下面理解property()方法语法:

class property([fget[, fset[, fdel[, doc]]]])

参数:fget-获取属性值的函数;fset-设置属性值的函数;fdel-删除属性值函数;doc-属性描述信息

实例

class C(object):
        def __init__(self):
                self._x = None

        def getx(self):
                return self._x

        def setx(self):
                self._x = value

        def delx(self):
                del self._x

        x = property(getx, setx, delx, "I'm the 'x' property.")

实例化结果:

注:c 是类C的实例化

1、c.x  触发getter;2、c.x = value 触发setter;3、del c.x 触发 deleter 

————————————————————    @property   ——————————————————————————————

将property 函数用作@property装饰器详解:

getter、setter、deleter方法用作装饰器

 1 class C(object):
 2     def __init__(self):
 3         self._x = None
 4 
 5     @property
 6     def x(self):
 7         """I'm 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        

理解以上,下面来考虑实际场景。

在绑定属性时,如果直接把属性暴露出去,写起来简单,但是没有办法检查参数,导致成绩可以随便改变:

s = Student()
s.score = 9999 #成绩未做校验

为了限制score范围,通过set_score()方法来设置成绩,再通过get_score()获取成绩,在set_score()里面

检查参数:

 1 class Student(object):
 2 
 3     def get_score(self):
 4 
 5             return self._score
 6 
 7     def set_score(self, value):
 8 
 9             if not isinstance(value, int):
10 
11                 raise ValueError('score must be an integer!')
12 
13             if value <0 or value > 100:
14 
15                 raise ValueError('score must between 0~100 !')
16 
17             self._score = value

现在对任意的Student实例进行操作,score就产生了限制:

>>>s = Student() #实例化
>>>s.set_score(60)
>>>s.get_score() #执行get获取成绩
60
>>>s.set_score(9999)#执行set方法校验
Traceback (most recent call last):
  ...
ValueError: score must between 0 ~ 100!

以上为常规方法实现,下面应用Python内置的@property装饰器负责把一个方法变成属性调用:

 1 class Student(object):
 2     
 3     @property
 4     def score(self):            #加上@property 把getter方法变成属性
 5             return self._score
 6 
 7     @score.setter         # 加上@score.setter 把setter方法变成属性赋值
 8     def score(self, value):
 9 
10         if not isinstance(value, int):
11             raise ValueError('score must be an integer!')
12 
13         if value < 0 or value > 100:
14             raise ValueError('score must between 0 ~ 100!')
15 
16         self._score = value 
17             

可控属性操作:

1 >>>s =Student()
2 >>>s.score = 60 #属性赋值操作,实际转化为s.set_score(60)
3 >>>s.score         #获取属性操作,实际转化为s.get_score()
4 60
5 >>> s.score = 9999
6 Traceback (most recent call last):
7   ...
8 ValueError: score must between 0 ~ 100!

注意这个@property,我们在对实例属性操作时,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现。

可以定义只读属性,只定义getter方法,不一定setter方法就是一个只读属性:

 1 class Student(object):
 2     
 3     @property
 4     def birth(self):
 5         return self._birth
 6 
 7     @birth.setter
 8     def birth(self, value):
 9         self._birth = value
10 
11     @property
12     def age(self):
13         return 2015 - self._birth

birth 是可读可写属性,age是只读属性

注:额外函数的名字和property下的一样。

到此,整个property装饰器理解结束,写进博客做记录。

本次资料源自:

廖雪峰:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143186781871161bc8d6497004764b398401a401d4cce000

菜鸟教程:

http://www.runoob.com/python/python-func-property.html

 

posted @ 2018-11-23 16:50  昨日不可追  阅读(681)  评论(0编辑  收藏  举报