概述
- property装饰器的作用是将属性的各种访问器(setx,getx,delx)合而为一,帮我们偷懒
- 原本的c.setx(value),加装饰器后简化为c.x = value
- 原本的print(c.getx()),加装饰器后简化为print(c.x)
- 原本的c.delx(),加装饰器后简化为del c.x
- 属性访问器的作用是为了保障数据安全,不清楚的可以参考属性访问器与数据安全
property是标准库提供的一个类,一个property实例映射一个普通类属性,我们可以在创建property时指定其对应属性的各种访问器,以下是官方例子的一个改版
# 官方源码案例的改进版
class C(object):
# 获取器(我们可以在这里设置相应的访问权限等)
def getx(self):
print("获取器:请出示一下您的身份证!")
return self.__x
# 设置器(我们可以在这里校验数据的合法性等)
def setx(self, value):
# 这里强制x的值必须大于0,否则抛出异常
if value < 0:
raise ValueError("a positive x required")
self.__x = value
# 删除器(我们可以在这里设置相应的访问权限等)
def delx(self):
# 这里必须输入正确的密码才能执行删除操作
pwd = input("please enter the admin pwd:")
if pwd == "123456":
del self.__x
print("x deleted!")
else:
print("密码错误,fuck off!")
# 创建property实例的方式,声明属性和它的各种“器”
x = property(fget=getx, fset=setx, fdel=delx, doc="I'm the 'x' property.")
现在__x属性通常的getx,setx,delx现在都被简化为x了
# 测试以property实例形式设置的属性
c = C()
c.x = 12 # setx
print(c.x) # getx
del c.x # 调用delx
# print(c.x) # 报AttributeError则证明删除成功
我们还可以通过property装饰器更简洁直观地对访问器进行定义,上述案例可以改写为
# 官方源码案例的改进版
# 以property装饰器的方式,声明属性和它的各种“器”
class C2(object):
# 属性声明,没有获取器时,可以作为获取器使用
@property
def x(self):
return self.__x
# 获取器(我们可以在这里设置相应的访问权限等)
@x.getter
def x(self):
"I'm the 'x' getter."
print("获取器:前台接待贵宾一位!")
return self.__x
# 设置器(我们可以在这里校验数据的合法性等)
@x.setter
def x(self, value):
# 这里强制x的值必须大于0,否则抛出异常
if value < 0:
raise ValueError("a positive x required")
self.__x = value
# 删除器(我们可以在这里设置相应的访问权限等)
@x.deleter
def x(self):
# 这里必须输入正确的密码才能执行删除操作
pwd = input("please enter the admin pwd:")
if pwd == "123456":
del self.__x
print("x deleted!")
else:
print("fuck off!")
对__x属性的设置、获取、删除,同样还是全部通过c.x一站式搞定,因为访问器函数都被命名为x了
# 使用装饰器版
c2 = C2()
# c2.x = -10 # ValueError: a positive x required
c2.x = 10 # 调用x.setter所装饰的函数
print(c2.x) # 调用x.getter所装饰的函数
del c2.x # 调用x.deleter所装饰的函数
# print(c2.x) # 报AttributeError证明删除成功
版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/pangzhaowen/article/details/80299631