python—property装饰器

概述

  • 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

你可能感兴趣的:(python分享)