pythonproperty属性,python中property的用法
仅供学习,转载请注明出处。
什么是房产属性?像实例属性一样使用的特殊属性,可以对应于特定的方法。
#静下心来创造一个胖老板阶层
在[24]中:类FatBoss():
.定义播放(自己):
.打印(胖老板:静下心来玩斗地主)
.#定义property属性
.@属性
.定义销售(自我):
.打印(《胖老板:从容卖包芙蓉王》)
.
#冷静下来,创建一个实例
在[25]中:fb=FatBoss()
#冷静地调用普通的实例方法
In [26]: fb.play()
老板:静下心来玩斗地主。
#冷静调用property属性对应的方法,冷静报错。这是为什么呢?
In [27]: fb.sell()
老板:静下心来卖包,芙蓉王。
-
类型错误回溯(最近一次调用)
模块中的ipython-input-27-a42050ff6e4f
- 1 fb.sell()
type error:“none type”对象不可调用
#原来属性的属性对应的方法是写不出来的(),所以用它作为selef.name,只不过它对应的是一个方法。
#则意味着属性不能从外部实例传入参数。
In [28]: fb.sell
老板:静下心来卖包,芙蓉王。
In [29]: FatBoss.sell
out[29]:0x7fd 84 f 7d 42 c 8处的属性
属性的定义和调用应注意以下几点:
定义时,在实例方法的基础上添加@ property decorator并且只调用一个self参数,不需要括号方法:fb.sell() property属性:fb.sell。
示例-JD.COM商城的分页
对于JD.COM商城的电脑主机列表页面,每个请求都无法在页面上显示数据库中的所有内容,但是可以通过分页功能在本地显示。因此,当从数据库中请求数据时,有必要显示对从物品M到物品n的所有数据的指定访问。分页功能包括:
根据当前页面和用户请求的数据总数计算M和N。为什么需要M和N的数字来根据M和N请求数据库中的数据?首先需要知道mysql等分页查询的SQL:select * from table _ name limit m,n。
[34]:班里传呼机:
.def __init__(self,current_page):
.#用户当前请求的页码
.self.current_page=当前页面
.#默认情况下,每页显示10页数据。
.self.per_items=10
.#定义property属性并计算起始值m限制m,n
.@属性
.def calculate_m(自身):
.val=(self . current _ page-1)* self . per _ items
.返回值
.#定义property属性并计算最终值n limit m,n
.@属性
.def calculate_n(自身):
.val=self . current _ page * self . per _ items
.返回值
.
在[35]中:
In [35]: p=Pager(1) #传入的当前页码是第一页。
在[36]: p.calculate_m
Out[36]: 0
在[37]: p.calculate_n
Out[37]: 10
在[38]中:
In [38]: p=Pager(10) #传入的当前页码是第10页。
在[39]: p.calculate_m
Out[39]: 90
在[40]: p.calculate_n
Out[40]: 100
在[41]:从上面的代码可以看出,只要添加@property作为装饰器,那么就可以直接获得类中的计算方法作为实例变量。
修饰属性有两种方式,即对方法应用decorator,即在类中用property对象的值定义类属性,对类的实例方法应用@property decorator。
Python中的类包括经典类和新类,新类的属性比经典类更丰富。(如果该类继承object,则该类是一个新类)
经典,带@属性装饰
在[41]中;班法特博斯:
.@属性
.定义销售(自我):
.返回“胖老板:从容卖包芙蓉王”
在[42]中:fb=FatBoss()
在[43]:打印(fb.sell)
老板:静下心来卖包,芙蓉王。
In [44]:一个有三个@ property decorators的新类。
在[45]中;类FatBoss:
.对象类在python3中默认被继承。
.python2和3执行这个程序的结果是不一样的,因为@xxx.setter @xxx.deleter只有python3才有。
.
.@属性
.定义销售(自我):
.返回“胖老板:从容卖包芙蓉王”
.#定义价格的属性price
.@属性
.定义价格(自身):
.打印( @property )
.#定义属性property price的setter方法
.@price.setter
.定义价格(自身,价值):
.打印( @price.setter )
.#定义property property price的deleter方法
.@price.deleter
.定义价格(自身):
.打印( @price.deleter )
.
在[46]中:fb=FatBoss()
In [47]: fb.price
@属性
In [48]: fb.price=17
@price.setter
In [49]: fb.price
@属性
在[50]:打印(预算价格)
@属性
从上面可以看出,fb.price=17会自动调用@price.setter的方法,这里有一个详细的例子。
属性设置者和删除者方法——胖子来找胖老板买烟,白送,有优惠。
有了胖老板的优惠,我再也不怕冷了。
注意
classic类中的属性只有一个访问方法,其对应的方法由@property修改。新类中的属性有三个访问方法,并且有三个由@property,@ method name修改的方法。setter和@方法名。删除器。因为新类中有三种访问方法,根据几个属性的访问特点,我们可以把三种方法定义为同一个属性:在[
.def __init__(self):
.#一包芙蓉王的原价
.self.original_price=26
.#胖子白买的话会打折。
.自我折扣=0.8
.#设置属性变量
.@属性
.定义价格(自身):
.#实际价格=原价*折扣
.new_price=self .原始价格* self.discount
.返回新价格
.#设置属性的setter方法
.@price.setter
.定义价格(自身,价值):
.self.original_price=值
.#设置属性的删除方法
.@price.deleter
.定义价格(自身):
.del self.original _价格
.
In [2]: fb=FatBoss()
In [3]: fb.price
输出[3]: 20.8
In [4]: fb.price=17
In [5]: fb.price
out[5]:13.60000000000001
In [6]: del fb.price
In [7]: fb.price
-
AttributeError Traceback(最近一次调用)
模块中的ipython-input-7-8b8b5efb4572
- 1英镑的价格
ipython-input-1-56837 AC 7 ad 5b in price(self)
9 def价格(自身):
10 #实际价格=原价*折扣
11 new _ price=self . original _ price * self . discount
12返回新价格
13 #设置属性的setter方法
attribute error:“fat boss”对象没有属性“original_price”
In [8]:一个class属性方法,创建一个值为property对象的class属性。
当使用class属性创建property属性时,经典类和新类之间没有区别。
在[8]:类FatBoss:
.def sell_ciggite(self):
.返回“芙蓉王”
.#定义属性
.SELL=property(sell_ciggite)
.
在[9]中:fb=FatBoss()
在[10]:打印(fb。SELL) #从结果来看,和调用@property是一样的。
王芙蓉
在[11]中:在[11]中有四个参数:属性方法。
第一个参数是方法名,它在调用对象时自动触发方法的执行。property===fb.price .第二个参数是方法名,调用对象时自动触发方法的执行。Property=XXX===fb.price=17。第三个参数是方法名,它在调用del对象时自动触发方法的执行。Property==delfb.price .第四个参数是一个字符串,它调用对象。财产。
那么在这里,上例中的setter和deleter是以SELL=property()的方式实现的。
在[17]中;类FatBoss:
.def __init__(self):
.self.original_price=26
.自我折扣=0.8
.定义价格(自身):
.new_price=self .原始价格* self.discount
.返回新价格
.def set_price(自身,值):
.self.original_price=值
.def del_price(自身):
.del self.original _价格
.#定义property属性
.price=property (price,set _ price,del _ price,这是价格的属性描述信息)
.
在[18]中:fb=FatBoss()
在[19]: fb。价格
Out[19]: 20.8
在[20]: fb。价格=17
在[21]: fb。价格
out[21]:13.6000000000001
在[22]: del fb。价格
在[23]: fb。价格
-
AttributeError Traceback(最近一次调用)
模块中的ipython-input-23-f1fcd9b37f75
- 1 fb。价格
ipython-input-17-DD 23 c 68d 302 b in价格(自带)
4自我折扣=0.8
5 def价格(自身):
-6 new _ price=self . original _ price * self .折扣
7返回新价格
8 def set_price(自身,价值):
attribute error:“fat boss”对象没有属性“original_price”
在[24]中:从上面的代码中可以看出,使用price=property的代码(price,set _ price,del _ price,这是price的属性描述信息),可以省略三个修饰符@ property @ price . setter @ price . deleter的使用。
总而言之:
定义property属性有两种方式,分别是[Decorator]和[Class Attribute],而[Decorator]对于经典类和新类是不同的。通过使用property属性,可以简化调用者获取数据的过程。说了这么多,应用实例是什么?
如果你不举例子,这就是结果。
property-应用私有属性来添加getter和setter方法类Money(object):
def __init__(self):
自我。__money=0
def getMoney(self):
回归自我。_ _钱
def setMoney(自身,价值):
if isinstance(value,int):
自我。_ _金钱=价值
否则:
print( error:not a integer number )使用property设置getter和setter方法类Money(object):
def __init__(self):
自我。__money=0
def getMoney(self):
回归自我。_ _钱
def setMoney(自身,价值):
if isinstance(value,int):
自我。_ _金钱=价值
否则:
Print(错误:不是整数)
#定义一个属性,在设置这个钱的值时调用setMoney,在获取值时调用getMoney。
金钱=财产(getMoney,setMoney)
a=钱()
A.money=100 #调用setMoney方法。
打印(a.money) #调用getMoney方法
#100用属性的装饰器替换getter和setter方法
重新实现了属性的设置和读取方法,可以进行边界判断。
类货币(对象):
def __init__(self):
自我。__money=0
#用decorator修饰money,那么会自动添加一个叫做money的属性。当钱的值被获得时,修饰的方法将被调用。
@属性
延期付款(自己):
回归自我。_ _钱
#用decorator修饰money,在设置money的值时调用decorated方法。
@money.setter
定义货币(自身,价值):
if isinstance(value,int):
自我。_ _金钱=价值
否则:
Print(错误:不是整数)
a=钱()
a .钱=100
印刷(货币)
关注微信微信官方账号,回复【数据】,Python,PHP,JAVA,web,即可获取Python,PHP,JAVA,前端等视频数据。
来自海洋的渔夫原创作品,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。