概述
@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)
由此再对应用进行扩展,对于不同的登录账号有不同访问权限,或者对于不同的用户托管属性返回不同的值等等。。。篇幅有限,这里就不一一实现了,感兴趣自己尝试。
Comments NOTHING