Property
在早期的python版本中,当我们对类的属性进行操作时,会调用一些像__getattr__()、setattr__()的特殊方法,如果我们有大量的属性时,这些方法会变得很臃肿。
如果我们的类有私有属性,那么在类外就不能通过.运算符直接访问该属性。需要定义一些get/set方法对属性进行操作。那么有没有比较优雅便捷的方式去访问它们呢,我们可以使用python中的property函数。我们可以看下面的类。
class PropertyTest(object):
def__init__(self):
self.__name = None
defgetName(self):
print'---in getName---'
returnself.__name
defsetName(self,value):
print'---in setName---'
self.__name = value
defdelName(self):
print'---in delName---'
delself.__name
nameNicky =property(getName,setName,delName,doc ='create an attribute nameNicky')
a= PropertyTest()
printa.nameNicky
a.nameNicky= 'kitty'
print a.nameNicky
print PropertyTest.nameNicky.__doc__
del a.nameNicky
在这个类中property函数接受类的方法作为参数,创建了一个属性nameNicky,用来处理类的私有特性__name。这样的话我们就可以通过nameNicky很方便的操作__name
当我们获取nameNicky的值时,会调用getName方法,当我们对nameNicky进行赋值时会调用setName方法,而当我们删除nameNicky时会调用delName方法,我们还可以给属性添加文档说明。
此外,我们还可以使用装饰器来实现上面的功能:
class PropertyTest(object):
def__init__(self):
self.__name = 'primary'
@property
defnameNicky(self):
print'---in getName---'
returnself.__name
@nameNicky.setter
defnameNicky(self,value):
print'---in setName---'
self.__name = value
@nameNicky.deleter
defnameNicky(self):
print'---in delName---'
delself.__name
a= PropertyTest()
print a.nameNicky
a.nameNicky = 'middle'
print a.nameNicky
del a.nameNicky
需要注意的是,属性nameNicky的三个方法要同名。而且此时我们只能通过“.”运算符访问nameNicky.