property屬性
什么是property屬性?
一種用起來像是使用的實(shí)例屬性一樣的特殊屬性 .property屬性的定義和調(diào)用要注意一下幾點(diǎn):
定義時(shí)使套,在實(shí)例方法的基礎(chǔ)上添加 @property 裝飾器;并且僅有一個(gè)self參數(shù)
調(diào)用時(shí)捣染,無需括號(hào)
Python的property屬性的功能是:property屬性內(nèi)部進(jìn)行一系列的邏輯計(jì)算,最終將計(jì)算結(jié)果返回停巷。
property屬性的實(shí)現(xiàn)有兩種方式
裝飾器 即:在方法上應(yīng)用裝飾器
類屬性 即:在類中定義值為property對(duì)象的類屬性
1. 裝飾器方式
在類的實(shí)例方法上應(yīng)用@property裝飾器
Python中的類有經(jīng)典類和新式類耍攘,新式類的屬性比經(jīng)典類的屬性豐富。( 如果類繼object畔勤,那么該類是新式類,python3均為新式類蕾各,python2中繼承了object的類為新式類 )
經(jīng)典類,具有一種@property裝飾器
# ############### 定義 ###############
class Goods:
@property
def price(self):
return "10"
# ############### 調(diào)用 ###############
obj = Goods()
result = obj.price # 自動(dòng)執(zhí)行 @property 修飾的 price 方法庆揪,并獲取方法的返回值
print(result)
新式類示损,具有三種@property裝飾器
# ############### 定義 ###############
class Goods:
"""python3中默認(rèn)繼承object類
以python2、3執(zhí)行此程序的結(jié)果不同嚷硫,因?yàn)橹挥性趐ython3中才有@xxx.setter @xxx.deleter
"""
@property
def price(self):
print('@property')
@price.setter
def price(self, value):
print('@price.setter')
@price.deleter
def price(self):
print('@price.deleter')
# ############### 調(diào)用 ###############
obj = Goods()
obj.price # 自動(dòng)執(zhí)行 @property 修飾的 price 方法检访,并獲取方法的返回值
obj.price = 123 # 自動(dòng)執(zhí)行 @price.setter 修飾的 price 方法始鱼,并將 123 賦值給方法的參數(shù)
del obj.price # 自動(dòng)執(zhí)行 @price.deleter 修飾的 price 方法
總結(jié)
經(jīng)典類中的屬性只有一種訪問方式,其對(duì)應(yīng)被 @property 修飾的方法
新式類中的屬性有三種訪問方式脆贵,并分別對(duì)應(yīng)了三個(gè)被@property医清、@方法名.setter、@方法名.deleter修飾的方法
由于新式類中具有三種訪問方式卖氨,我們可以根據(jù)它們幾個(gè)屬性的訪問特點(diǎn)会烙,分別將三個(gè)方法定義為對(duì)同一個(gè)屬性:獲取、修改筒捺、刪除
2. 類屬性方式柏腻,創(chuàng)建值為property對(duì)象的類屬性
當(dāng)使用類屬性的方式創(chuàng)建property屬性時(shí),經(jīng)典類和新式類無區(qū)別
property方法中有個(gè)四個(gè)參數(shù)
- 第一個(gè)參數(shù)是方法名系吭,調(diào)用 對(duì)象.屬性 時(shí)自動(dòng)觸發(fā)執(zhí)行方法
- 第二個(gè)參數(shù)是方法名五嫂,調(diào)用 對(duì)象.屬性 = XXX 時(shí)自動(dòng)觸發(fā)執(zhí)行方法
- 第三個(gè)參數(shù)是方法名,調(diào)用 del 對(duì)象.屬性 時(shí)自動(dòng)觸發(fā)執(zhí)行方法
- 第四個(gè)參數(shù)是字符串肯尺,調(diào)用 對(duì)象.屬性.doc 沃缘,此參數(shù)是該屬性的描述信息
class Foo(object):
def get_bar(self):
print("getter...")
return '100'
def set_bar(self, value):
"""必須兩個(gè)參數(shù)"""
print("setter...")
return 'set value' + value
def del_bar(self):
print("deleter...")
return '100'
# 類屬性方式, 創(chuàng)建值為property對(duì)象的類屬性
BAR = property(get_bar, set_bar, del_bar, "description...")
obj = Foo()
obj.BAR # 自動(dòng)調(diào)用第一個(gè)參數(shù)中定義的方法:get_bar
obj.BAR = "alex" # 自動(dòng)調(diào)用第二個(gè)參數(shù)中定義的方法:set_bar方法,并將“alex”當(dāng)作參數(shù)傳入
desc = Foo.BAR.__doc__ # 自動(dòng)獲取第四個(gè)參數(shù)中設(shè)置的值:description...
print(desc)
del obj.BAR # 自動(dòng)調(diào)用第三個(gè)參數(shù)中定義的方法:del_bar方法
總結(jié)
由于類屬性方式創(chuàng)建property屬性具有3種訪問方式则吟,我們可以根據(jù)它們幾個(gè)屬性的訪問特點(diǎn)槐臀,分別將三個(gè)方法定義為對(duì)同一個(gè)屬性:獲取、修改氓仲、刪除
綜上所述:
定義property屬性共有兩種方式水慨,分別是【裝飾器】和【類屬性】
【裝飾器】方式針對(duì)經(jīng)典類和新式類又有所不同。
經(jīng)典類中的屬性只有一種訪問方式敬扛,其對(duì)應(yīng)被 @property 修飾的方法
新式類中的屬性有三種訪問方式讥巡,并分別對(duì)應(yīng)了三個(gè)被@property、@方法名.setter舔哪、@方法名.deleter修飾的方法
當(dāng)使用【類屬性】的方式創(chuàng)建property屬性時(shí)欢顷,經(jīng)典類和新式類無區(qū)別
通過使用property屬性,能夠簡化調(diào)用者在獲取數(shù)據(jù)的流程