概述

@property装饰器与property()方法都是用在类结构中,把被修饰的方法转换为属性方便在类外进行调用和操作。

property装饰器包含三个操作类型:读、写、删

通俗的来说,一般我们在调用类方法的时候,必然是通过方法名()进行调用的,但是通过装饰器就可以把类方法转换成属性,通过方法名即可调用,我们把被转换的方法称之为“托管属性”

property()方法

property方法是在类结构内直接使用的系统函数,返回一个托管属性值,通过变量保存即可获得托管属性:

name=property(fget=null,fset=null,fdel=null,doc=null)

其中:

  • fget 获取属性值的函数
  • fset 设置属性值的函数
  • fdel 删除属性值的函数
  • doc 说明文本

直接上代码:

class My:
    def __init__(self):
        self.__name="小杜"
    def getName(self):
        return self.__name
    def setName(self,value):
        self.__name=value
    def delName(self):
        print("就不给你删")
    n=property(getName,setName,delName,"示
例代码")
my=My()
my.n="Proking"
print(my.n)

以上代码使用了property()方法,通过property方法定义了一个托管属性,并且绑定三个操作对应的方法,如果执行这三个操作就自动调用类结构内的这三个方法。

运行一下上面的代码,输出Proking,如果这时候执行del my.n:

del my.n
print(my.n)

运行结果:

这时候并没有删除n这个属性,而是调用了delName方法,所以我们可以理解为,property方法就是对产生类属性,并且对属性的查、删、改操作绑定对应的类方法,通过property属性就可以实现对类属性的限制操作,例如上面例子就是不可以删除类属性。

但是property定义的托管属性必须对三个操作都有定义,缺一不可,如果缺少一个:

抛出以上异常,所以这时候就要使用@peoperty装饰器来定义托管属性:

class myclass:
    @property
    def func(self):
    
    @func.sertter
    def func(self,value):
    
    @func.deleter
    def func(self):
    code...

以上是property装饰器的基本语法,与property属性不同的是,装饰器直接在类方法上一行声明,表示这个方法成为托管属性,并且不需要向上面一样必须定义三个操作对应的方法。

解释一下,上面的三种第一个装饰器定死就是@property表示此方法成为托管属性,可以且只能通过类属性访问,@func.setter定义的方法是托管属性被更改是调用的属性,其中func与被定义的方法名对应,deleter同理。

上代码:

class My:
    __name="proking"
    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self,value):
        self.__name=value
my=My()
# my.n="Proking"
print(my.name)

上面的代码等同于:

class My:
    def __init__(self):
        self.__name="小杜"
    def getName(self):
        return self.__name
    def setName(self,value):
        self.__name=value
    def delName(self):
        print("就不给你删")
    n=property(getName,setName,"示
例代码")

但是这段代码直接运行,会报错,也就是上面截图的错误, 但是通过@property装饰器就不会报错,除非你执行del my.name 因为没有定义删除器,所以会报错,这也可以对属性访问和操作进行限制。

不妨把思想再扩展一些?既然使用了方法,把方法作为托管属性,但他的本质仍然是方法,那么就有了可操作性:

如果在程序中默认不准修改和删除某一个私有属性,除非开启调试模式,在这个场景下如何实现代码?
这是个很基础的应用,其实也就是一个流程控制,然后定义一个属性作为调试模式的开关:

class Shop:
    # 私有属性:是否开启调试
    __debug=0
    # 私有属性,商品价格
    __price=100
    #定义托管属性访问价格
    @property
    def price(self):
        return self.__price
    @price.setter
    def price(self,v):
        if self.__debug==1:
            self.__price=v
        else:
            print("禁止修改")
    @price.deleter
    def price(self):
        if self.__debug==1:
            del self.__price
        else:
            print("禁止修改")
shop=Shop()
print(shop.price)
del shop.price
print(shop.price)
shop.price=10
print(shop.price)

由此再对应用进行扩展,对于不同的登录账号有不同访问权限,或者对于不同的用户托管属性返回不同的值等等。。。篇幅有限,这里就不一一实现了,感兴趣自己尝试。