写在前面,python中proprety在python中大量使用,尤其是在一些框架和网络大牛写的代码中,非常常见,所有学习proprety就非常必要了,废话不多说,直接上代码:
一.使用定义实例属性来使用
# 定义实例方法的方法来使用
class Test(object):
# 可以定义参数
def __init__(self, name="liming"):
self.__age = 18
if name == "liming":
self.name = "liming"
else:
self.name = name
def getage(self):
print("获取属性的时候调用")
if self.name == 'likang':
return self.__age
else:
print("%s这个用户不能访问当前的这个属性" % self.name)
def setage(self, value):
if self.name == 'lili':
self.__age = value
else:
print("无权进行修改")
def delage(self):
del self.__age
print("删除属性的时候调用")
age = property(getage, setage, delage)
if __name__ == '__main__':
test = Test()
test.age = 20
输出:
无权进行修改
第一种用法,定义实例方法,然后创建proprety的实例对象,注意:在定义三个方法的时候,setxxx,getxxx,delxxx中的”xxx”必须保持一致.proprety主要的是用来当一个对象要操作比较敏感属性的时候,可以对属性进行保护和对数据进行筛选,以免出现不期待的结果发生.
二.使用装饰器的方法来使用:
class Test(object):
def __init__(self, name='liming'):
self.__age = 18
if name == 'liming':
self.name = 'liming'
else:
self.name = name
@property
def age(self):
if self.name == "liming":
return self.__age
else:
print("%s无权访问该属性")
@age.setter
def age(self, value):
if self.name == "lili":
self.__age = value
else:
print("无权修改该属性")
@age.deleter
def age(self):
del self.__age
test = Test()
test.age = 20
输出:
无权修改该属性
总结:使用proprety方法,可以保证数据被正确的访问和赋值,在访问数据的时候,可以对用户进行权限相关的验证等,从而保证了数据的稳定性.
最后,贴出proprety的部分源码:
property(fget=None, fset=None, fdel=None, doc=None) -> property attribute
fget is a function to be used for getting an attribute value, and likewise
fset is a function for setting, and fdel a function for del'ing, an
attribute. Typical use is to define a managed attribute x:
class C(object):
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.")
Decorators make defining new properties or modifying existing ones easy:
class C(object):
@property
def x(self):
"I am the 'x' property."
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
# (copied from class doc)