一文详述 Python 中的 property 语法
property()函数的作用是在新式类中返回属性值。
Python中有一个property的语法,它类似于C#的getset语法,其功能有以下两点:
- 将类方法设置为只读属性;
- 实现属性的getter和setter方法;
下面开始本文的重点介绍,Python中的property语法介绍,具体内容如下所示:
在大多数语言的程序中,一个类,每有一个属性,就会对应setter和getter,基本都是标配。
示例:
classMoney(object): def__init__(self): self.__money=0 defgetMoney(self): returnself.__money defsetMoney(self,value): ifisinstance(value,int): self.__money=value else: print("error:不是整型数字")
设置私有属性的目的就是不想让数据被误取出来,增加一个方法去获取私有属性或者设置私有属性,那么就保证将来想获取属性的时候就获取,想设置的时候还可以进行过滤。
其他语言基本都是这么做的,但是Python不推荐。Python有property。
一、什么是property属性
一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法。
classFoo: deffunc(self): pass #定义property属性 @property defprop(self): pass foo_obj=Foo() foo_obj.func()#调用实例方法 foo_obj.prop#调用property属性
示例:
classGoods: @property defsize(self): return100 obj=Goods() ret=obj.size#调用属性 print(ret)#100
obj.size会自动地去调用size方法,返回size方法的返回值。
property属性的定义和调用要注意以下几点:
- 定义时,在实例方法的基础上添加@property装饰器;
- 仅有一个self参数;
- 调用时,无需括号。
那property属性到底是用来干什么的?下面看一个实例。
对于京东商城中显示电脑主机的列表页面,每次请求不可能把数据库中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求数据时就要显示的指定获取从第m条到第n条的所有数据,这个分页的功能包括:
- 根据用户请求的当前页和总数据条数计算出m和n。
- 根据m和n去数据库中请求数据。
classPager: def__init__(self,current_page): #用户当前请求的页码(第一页、第二页...) self.current_page=current_page #每页默认显示10条数据 self.per_items=10 @property defstart(self): val=(self.current_page-1)*self.per_items returnval @property defend(self): val=self.current_page*self.per_items returnval p=Pager(1) p.start#就是起始值,即:m p.end#就是结束值,即:n
从上述可见,Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回。
二、property属性的有两种方式
- 装饰器即:在方法上应用装饰器。
- 类属性即:在类中定义值为property对象的类属性。
1、装饰器方式
在类的实例方法上应用@property装饰器。
Python中的类有经典类和新式类,新式类的属性比经典类的属性丰富。(如果类继object,那么该类是新式类)
经典类,具有一种@property装饰器。
classGoods: @property defprice(self): return"laowang" obj=Goods() #自动执行@property修饰的price方法,并获取方法的返回值 result=obj.price print(result)#laowang
新式类,具有三种@property装饰器。
python3中默认继承object类,只有在python3中才有@xxx.setter@xxx.deleter。
classGoods: @property defprice(self): print('@property') @price.setter defprice(self,value): print('@price.setter') @price.deleter defprice(self): print('@price.deleter') obj=Goods() #自动执行@property修饰的price方法,并获取方法的返回值 obj.price#@property #自动执行@price.setter修饰的price方法,并将123赋值给方法的参数 obj.price=123#@price.setter #自动执行@price.deleter修饰的price方法 delobj.price#@price.deleter
注意:
- 经典类中的属性只有一种访问方式,其对应被@property修饰的方法。
- 新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法。
由于新式类中具有三种访问方式,我们可以根据它们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除。
示例:
classGoods(object): def__init__(self): #原价 self.original_price=100 #折扣 self.discount=0.8 @property defprice(self): #实际价格=原价*折扣 new_price=self.original_price*self.discount returnnew_price @price.setter defprice(self,value): self.original_price=value @price.deleter defprice(self): delself.original_price obj=Goods() obj.price#获取商品价格 obj.price=200#修改商品原价 delobj.price#删除商品原价
2、类属性方式
创建值为property对象的类属性。
当使用类属性的方式创建property属性时,经典类和新式类无区别。
示例:
classFoo: defget_bar(self): return'laowang' BAR=property(get_bar) obj=Foo() reuslt=obj.BAR#自动调用get_bar方法,并获取方法的返回值 print(reuslt)#laowang
property方法中有个四个参数
- 第一个参数是方法名,调用对象.属性时自动触发执行方法。
- 第二个参数是方法名,调用对象.属性=XXX时自动触发执行方法。
- 第三个参数是方法名,调用del对象.属性时自动触发执行方法。第四个参数是字符串,调用对象.属性.__doc__,此参数是该属性的描述信息。
示例:
classFoo(object): defget_bar(self): print("getter...") return'laowang' defset_bar(self,value): """必须两个参数""" print("setter...") return'setvalue'+value defdel_bar(self): print("deleter...") return'laowang' BAR=property(get_bar,set_bar,del_bar,"description...") obj=Foo() #自动调用第一个参数中定义的方法:get_bar obj.BAR#getter... #自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入 obj.BAR="alex"#setter... #自动获取第四个参数中设置的值:description... desc=Foo.BAR.__doc__ print(desc)#description... #自动调用第三个参数中定义的方法:del_bar方法 delobj.BAR#deleter...
由于类属性方式创建property属性具有3种访问方式,我们可以根据它们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除。
classGoods(object): def__init__(self): #原价 self.original_price=100 #折扣 self.discount=0.8 defget_price(self): #实际价格=原价*折扣 new_price=self.original_price*self.discount returnnew_price defset_price(self,value): self.original_price=value defdel_price(self): delself.original_price PRICE=property(get_price,set_price,del_price,'价格属性描述...') obj=Goods() obj.PRICE#获取商品价格 obj.PRICE=200#修改商品原价 delobj.PRICE#删除商品原价
综上所述:
- 定义property属性共有两种方式,分别是【装饰器】和【类属性】,而【装饰器】方式针对经典类和新式类又有所不同。
- 通过使用property属性,能够简化调用者在获取数据的流程。
总结
到此这篇关于一文详述Python中的property语法的文章就介绍到这了,更多相关Python中的property语法内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。