python通过property达到像调用属性一样来调用方法。
存在两种方式:
(1) 类属性:在类中定义值为property对象的类属性。
(2) 装饰器:在方法上应用装饰器@property。
用法
property(fget=None, fset=None, fdel=None, doc=None)
#比如:
class C(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
x = property(getx, setx, delx, "I'm the 'x' property.")
描述
将property()函数赋值给属性x,属性x要和def的函数名一致。
fget – 获取属性值的函数
fset – 设置属性值的函数
fdel – 删除属性值函数
doc – 属性描述信息
c=C(), 则c.x 将触发 getter,c.x = value 将触发 setter , del c.x 触发 deleter,C.x.__doc__将获取doc值。
注意:getx里面的self._x不能用self.x,因为self.x会自动调用getx,这样就会陷入无限循环。
示例
>>> class MyPro:
def __init__(self):self._name=None
def getname(self):return self._name
def setname(self,name):self._name=name
def delname(self):del self._name
name=property(getname,setname,delname,'这是name property')
>>> mp=MyPro()
# 调用属性一样调用方法
>>> mp.name='梯阅线条'
>>> mp.name
'梯阅线条'
>>> MyPro.name.__doc__
'这是name property'
>>> del mp.name
>>> mp.name
Traceback (most recent call last):
File "" , line 1, in <module>
mp.name
File "" , line 3, in getname
def getname(self):return self._name
AttributeError: 'MyPro' object has no attribute '_name'