-
In [22]: class student:
-
def getscore(self):
-
return self.score
-
def setscore(self,value):
-
if not isinstance(value,int):
-
raise ValueError('score must be an integer!')
-
elif value < 0 or value > 100:
-
raise ValueError('score must between 0-100!')
-
self.score = value
-
....:
-
-
In [23]: s = student()
-
-
In [24]: s.setscore(60)
-
-
In [25]: s.getscore()
-
Out[25]: 60
以上这个实例,建立一个student类,这个类中有两个方法:getscore和setscore
setscore 方法:参数为score 作为值赋予变量 self.score
getscore 方法: 直接返回 self.score
将student类实例化为 s , 调用
setscore
方法给参数赋值,在调用
getscore方法返回赋值
上面这个操作调用方法过于复杂,没有属性来的直接简单。
有没有既能检查参数,又可以用类似属性这样简单的方式来访问类的变量呢?使用python内置的property装饰器就可以做到把一个方法变成属性调用的。
修改上面类:
-
In [54]: class student(object):
-
@property
-
def score(self):
-
return self._score
-
@score.setter
-
def score(self,value):
-
if not isinstance(value,int):
-
raise ValueError('muse be num!')
-
if value < 0 or value > 100:
-
raise ValueError('must be 0~100!')
-
self._score = value
-
....:
-
-
In [55]: s = student()
-
-
In [56]: s.score = 19
-
-
In [57]: print s.score
-
19
-
-
In [58]: s.score = 101
-
---------------------------------------------------------------------------
-
ValueError Traceback (most recent call last)
-
<ipython-input-58-84f4bf77cd8e> in <module>()
-
----> 1 s.score = 101
-
-
<ipython-input-54-52de4c55bf21> in score(self, value)
-
8 raise ValueError('muse be num!')
-
9 if value < 0 or value > 100:
-
---> 10 raise ValueError('must be 0~100!')
-
11 self._score = value
-
12
-
-
ValueError: must be 0~
把一个getter方法变成属性,只需要加上@property就可以了,此时@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值。
在看一个实例:
-
In [38]: class test(object):
-
....: def __init__(self):
-
....: self.__x = None
-
....: def getx(self):
-
....: return self.__x
-
....: def setx(self,value):
-
....: self.__x = value
-
....: def delx(self):
-
....: del self.__x
该类中存在三个方法: getx() 、setx() 、delx() 通过@property 改下这三个方法为属性,代码如下:
-
In [58]: class test(object):
-
def __init__(self):
-
self.__x = None
-
@property
-
def x(self):
-
return self.__x
-
@x.setter
-
def x(self,value):
-
self.__x = value
-
@x.deleter
-
def x(self):
-
del self.__x
-
....:
-
-
In [59]: abc = test()
-
-
In [60]: abc.x = 'hello'
-
-
In [61]: print abc.x
-
hello
-
-
In [62]: del abc.x
统一属性的三个方法名要一致。
property函数原型:property(fget=None,fset=None,fdel=None,doc=None)
阅读(1578) | 评论(0) | 转发(0) |