python 类property, setter,getter使用
前言
本篇学习一下python中property装饰器,setter,getter的使用
property装饰器
python类中,property装饰器用于将方法转换成同名只读属性,被装饰的方法可以像成员一样调用,例如:
class TestClass(object):
def __init__(self, value):
self._value = value
@property
def test(self):
return 1
t = TestClass(10)
print(t.test) # 1
类属性getter
进一步,使用property装饰类内成员,可以防止成员被误修改。比如下面类中的_value
成员,可以直接从外部读取和修改内容。使用@property
装饰的value
属性可以像成员一样直接读取(getter),但不可以被直接修改了。
class MyClass(object):
def __init__(self, value):
self._value = value
@property
def value(self):
return self._value
c1 = MyClass(10)
print(c1._value) # 10
c1._value = 20 # OK 但不安全
print(c1.value) # 20
c1.value = 20 # error!
类属性setter,deleter
如果想通过修改属性,可以使用属性setter
;如果想删除属性,可以使用deleter
:
class MyClass(object):
def __init__(self, value):
self._value = value
@property
def value(self):
return self._value
@value.setter
def value(self, value):
self._value = value
@value.getter
def value(self):
return self._value
@value.deleter
def value(self):
del self._value
c1 = MyClass(10)
print(c1.value) # 10
c1.value = 20
print(c1.value) # 20
del c1.value # _value成员被删除
print(c1.value) # 报_value不存在的错误
property函数
此外,还可以通过property()
这个函数把类方法转换成类属性,参数按顺序分别是getter,setter,deleter,doc(参数可缺省):
class MyClass2(object):
def __init__(self, value):
self._value = value
def get_value(self):
return self._value
def set_value(self, value):
self._value = value
def del_value(self):
del self._value
PROPERTY = property(get_value, set_value, del_value, 'Class MyClass2')
print(MyClass2.PROPERTY.__doc__) # Class MyClass2
c2 = MyClass2(10)
print(c2.PROPERTY) # 10
c2.PROPERTY = 20
print(c2.PROPERTY) # 20
del c2.PROPERTY # _value成员被删除
# print(c2.PROPERTY) # 报_value成员不存在的错误