通过实例了解python property属性
这篇文章主要介绍了通过实例了解pythonproperty属性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
1.什么是property属性
一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法
################定义############### classFoo: deffunc(self): pass #定义property属性 @property defprop(self): pass ################调用############### foo_obj=Foo() foo_obj.func()#调用实例方法 foo_obj.prop#调用property属性
如下的例子用于说明如何定一个简单的property属性:
classGoods(object): @property defsize(self): return100 g=Goods() print(g.size)
property属性的定义和调用要注意一下几点:
- 定义时,在实例方法的基础上添加@property装饰器;并且仅有一个self参数
- 调用时,无需括号
2.简单的实例
对于京东商城中显示电脑主机的列表页面,每次请求不可能把数据库中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求数据时就要显示的指定获取从第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属性内部进行一系列的逻辑计算,最终将计算结果返回。
3.property属性的有两种方式
- 装饰器即:在方法上应用装饰器
- 类属性即:在类中定义值为property对象的类属性
3.1装饰器方式
在类的实例方法上应用@property装饰器
Python中的类有经典类和新式类,新式类的属性比经典类的属性丰富。(如果类继object,那么该类是新式类)
经典类,具有一种@property装饰器:
################定义############### classGoods: @property defprice(self): return"laowang" ################调用############### obj=Goods() result=obj.price#自动执行@property修饰的price方法,并获取方法的返回值 print(result)
新式类,具有三种@property装饰器:
#coding=utf-8 ################定义############### classGoods: """python3中默认继承object类 以python2、3执行此程序的结果不同,因为只有在python3中才有@xxx.setter@xxx.deleter """ @property defprice(self): print('@property') @price.setter defprice(self,value): print('@price.setter') @price.deleter defprice(self): print('@price.deleter') ################调用############### obj=Goods() obj.price#自动执行@property修饰的price方法,并获取方法的返回值 obj.price=123#自动执行@price.setter修饰的price方法,并将123赋值给方法的参数 delobj.price#自动执行@price.deleter修饰的price方法
注意:
- 经典类中的属性只有一种访问方式,其对应被@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#删除商品原价
3.2类属性方式,创建值为property对象的类属性
当使用类属性的方式创建property属性时,经典类和新式类无区别
classFoo: defget_bar(self): return'laowang' BAR=property(get_bar) obj=Foo() reuslt=obj.BAR#自动调用get_bar方法,并获取方法的返回值 print(reuslt)
property方法中有个四个参数
- 第一个参数是方法名,调用对象.属性时自动触发执行方法
- 第二个参数是方法名,调用对象.属性=XXX时自动触发执行方法
- 第三个参数是方法名,调用del对象.属性时自动触发执行方法
- 第四个参数是字符串,调用对象.属性.__doc__,此参数是该属性的描述信息
#coding=utf-8 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() obj.BAR#自动调用第一个参数中定义的方法:get_bar obj.BAR="alex"#自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入 desc=Foo.BAR.__doc__#自动获取第四个参数中设置的值:description... print(desc) delobj.BAR#自动调用第三个参数中定义的方法:del_bar方法
由于类属性方式创建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属性,能够简化调用者在获取数据的流程
4.property属性-应用
4.1.私有属性添加getter和setter方法
classMoney(object): def__init__(self): self.__money=0 defgetMoney(self): returnself.__money defsetMoney(self,value): ifisinstance(value,int): self.__money=value else: print("error:不是整型数字")
4.2.使用property升级getter和setter方法
classMoney(object): def__init__(self): self.__money=0 defgetMoney(self): returnself.__money defsetMoney(self,value): ifisinstance(value,int): self.__money=value else: print("error:不是整型数字") #定义一个属性,当对这个money设置值时调用setMoney,当获取值时调用getMoney money=property(getMoney,setMoney) a=Money() a.money=100#调用setMoney方法 print(a.money)#调用getMoney方法 #100
4.3.使用property取代getter和setter方法
重新实现一个属性的设置和读取方法,可做边界判定
classMoney(object): def__init__(self): self.__money=0 #使用装饰器对money进行装饰,那么会自动添加一个叫money的属性,当调用获取money的值时,调用装饰的方法 @property defmoney(self): returnself.__money #使用装饰器对money进行装饰,当对money设置值时,调用装饰的方法 @money.setter defmoney(self,value): ifisinstance(value,int): self.__money=value else: print("error:不是整型数字") a=Money() a.money=100 print(a.money)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。