1.@property属性装饰器
使用属性装饰器可以将一个类方法转变成一个类属性。
class Person:
def __init__(self,name):
self.name = name
self._age = 0
def set_age(self,value):
if value<0 or value > 120:
print('参数不合法')
else:
self._age = value
def get_age(self):
return self._age
>>> p = Person()
>>> p.name = 'li'
>>> p.name
'li'
>>> p.set_age(-1)
参数不合法
>>>
当我们想要使用name属性时,可以使用点语法p.name='li',非常的方便快捷。但在我们需要对赋值的变量进行数据筛选检查时,这时就无法满足需要了。我们需要重写属性的setter方法,和getter方法,然而,直接访问setter方法和getter方法,又会显得代码比较臃肿。此时,我们就可以使用@property修饰符。
class Person:
def __init__(self,name):
self.name = name
self._age = 10
@property
def age(self):
return self._age
>>> p = Person('li')
>>> p.age
10
我们通过函数名age,就可以非常方便的读出_age的值,但此时_age属性在不直接访问时,相当于的是只读的。@property相当于重写了_age的getter方法,当然我们也有相应的setter方法和deleter方法。
在保持getter、setter、deleter使用同一个函数名的情况下,进行@函数名.setter 或者@函数名.deleter修饰
class Person:
def __init__(self,name):
self.name = name
self._age = 10
@property
def age(self):
return self._age
@age.setter
def age(self,value):
if value<0 or value > 120:
print('参数不合法')
else:
self._age = value
@age.deleter
def age(self):
del self._age
>>> p = Person('li')
>>> p.age = 20
>>> p.age
20
>>> del p.age
>>> p.age
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
p.age
File "<pyshell#4>", line 8, in age
return self._age
AttributeError: 'Person' object has no attribute '_age'
注意:在使用@函数名.setter和@函数名.deleter方式时,必须要和@propety修饰的函数名保持一致,同时,也要使@propety修饰的函数在最前面,不然会报错。
2.property()函数
class property([fget[, fset[, fdel[, doc]]]])
- fget -- 获取属性值的函数
- fset -- 设置属性值的函数
- fdel -- 删除属性值函数
- doc -- 属性描述信息
class Person:
def __init__(self):
self._age = 0
def set_age(self,value):
if value<0 or value > 120:
print('参数不合法')
else:
self._age = value
def get_age(self):
return self._age
def del_age(self):
del self._age
age = property(get_age,set_age,del_age)
>>> p = Person()
>>> p.age = -1
参数不合法
>>> p.age = 12
>>> p.age
12
property()函数的作用就是把变量age与函数set_age、get_age等关联起来,通过age可以直接访问setter和getter方法。
网友评论