一广鳍、再論靜態(tài)方法和類方法以及實(shí)例方法
1.1、類屬性、實(shí)例屬性
它們?cè)诙x和使用中有所區(qū)別,而最本質(zhì)的區(qū)別是內(nèi)存中保存的位置不同
實(shí)例屬性屬于對(duì)象
類屬性屬于類
由上述代碼可以看出【實(shí)例屬性需要通過對(duì)象來訪問】【類屬性通過類訪問】筝闹,在使用上可以看出 實(shí)例屬性和類屬性的歸屬是不同的。 類屬性在內(nèi)存中只保存一份 實(shí)例屬性在每個(gè)對(duì)象中都要保存一份 應(yīng)用場(chǎng)景:通過類創(chuàng)建實(shí)例對(duì)象時(shí),如果每個(gè)對(duì)象需要具有相同名字的屬性关顷,那么就使用類屬性糊秆,用一份既可?
.2、實(shí)例方法议双、靜態(tài)方法和類方法(類里面的三種方法痘番,區(qū)別在于調(diào)用方式不同)
實(shí)例方法:由對(duì)象調(diào)用;至少一個(gè)self參數(shù)平痰;執(zhí)行實(shí)例方法時(shí)汞舱,自動(dòng)將調(diào)用該方法的對(duì)象賦值給self;
類方法:由類調(diào)用宗雇; 至少一個(gè)cls參數(shù)昂芜;執(zhí)行類方法時(shí),自動(dòng)將調(diào)用該方法的類賦值給cls逾礁;
靜態(tài)方法:由類調(diào)用;無默認(rèn)參數(shù)
class Foo(object):
? ? def __init__(self, name):
? ? ? ? ? self.name = name
def ord_func(self):
? ? """ 定義實(shí)例方法访惜,至少有一個(gè)self參數(shù) """
? ? # print(self.name)
? ? print('實(shí)例方法')
@classmethod
def class_func(cls):
? ? """ 定義類方法嘹履,至少有一個(gè)cls參數(shù) """
? ? print('類方法')
@staticmethod
def static_func():
? ? """ 定義靜態(tài)方法 ,無默認(rèn)參數(shù)"""
? ? print('靜態(tài)方法')
f = Foo("中國")
# 調(diào)用實(shí)例方法
f.ord_func()
# 調(diào)用類方法
Foo.class_func()
# 調(diào)用靜態(tài)方法
Foo.static_func()
相同點(diǎn):對(duì)于所有的方法而言债热,均屬于類砾嫉,所以 在內(nèi)存中也只保存一份
不同點(diǎn):方法調(diào)用者不同、調(diào)用方法時(shí)自動(dòng)傳入的參數(shù)不同窒篱。
二焕刮、property 屬性
2.1、什么是property屬性墙杯,在方法名的加上property就是?property屬性配并,在調(diào)用上?dog.run?優(yōu)于?dog.run() #類似與將方法轉(zhuǎn)化為屬性的方式
property屬性的定義和調(diào)用要注意一下幾點(diǎn):
定義時(shí),在實(shí)例方法的基礎(chǔ)上添加 @property 裝飾器高镐;并且僅有一個(gè)self參數(shù)
調(diào)用時(shí)溉旋,無需括號(hào)
2.2、property屬性有兩種方式
裝飾器即:在方法上應(yīng)用裝飾器
類屬性即:在類中定義值為property對(duì)象的類屬性
2.2.1嫉髓、裝飾器方式
在類的實(shí)例方法上應(yīng)用@property裝飾器观腊,Python中的類有經(jīng)典類和新式類,新式類的屬性比經(jīng)典類的屬性豐富算行。( 如果類繼object梧油,那么該類是新式類)
經(jīng)典類,具有一種@property裝飾器
2.2.1州邢、裝飾器方式
在類的實(shí)例方法上應(yīng)用@property裝飾器儡陨,Python中的類有經(jīng)典類和新式類,新式類的屬性比經(jīng)典類的屬性豐富。( 如果類繼object迄委,那么該類是新式類)
經(jīng)典類褐筛,具有一種@property裝飾器
新式類,具有三種@property裝飾器
由于新式類中具有三種訪問方式叙身,我們可以根據(jù)它們幾個(gè)屬性的訪問特點(diǎn)渔扎,分別將三個(gè)方法定義為對(duì)同一個(gè)屬性:獲取、修改信轿、刪除
class Goods(object):
? ? def __init__(self):
? ? ? ? # 原價(jià)
? ? ? ? self.original_price = 100
? ? ? ? # 折扣
? ? ? ? self.discount = 0.8
? ? @property
? ? def price(self):
? ? ? ? # 實(shí)際價(jià)格 = 原價(jià) * 折扣
? ? ? ? new_price = self.original_price * self.discount
? ? ? ? return new_price
? ? @price.setter
? ? def price(self, value):
? ? ? ? self.original_price = value
? ? @price.deleter
? ? def price(self):
? ? ? ? del self.original_price
obj = Goods()
obj.price? ? ? ? # 獲取商品價(jià)格
obj.price = 200? # 修改商品原價(jià)
del obj.price? ? # 刪除商品原價(jià)
2.2.2晃痴、類屬性 方式,創(chuàng)建值為property對(duì)象的類屬性,我比較喜歡這個(gè)方式
當(dāng)使用?類屬性?的方式創(chuàng)建?property屬性?時(shí)财忽,經(jīng)典類?和?新式類?無區(qū)別
property 方法中有個(gè) 四個(gè)參數(shù)
第 1 個(gè)參數(shù)是方法名倘核,調(diào)用 對(duì)象.屬性 時(shí)自動(dòng)觸發(fā)執(zhí)行方法
第 2 個(gè)參數(shù)是方法名,調(diào)用 對(duì)象.屬性 = XXX 時(shí)自動(dòng)觸發(fā)執(zhí)行方法
第 3 個(gè)參數(shù)是方法名即彪,調(diào)用 del 對(duì)象.屬性 時(shí)自動(dòng)觸發(fā)執(zhí)行方法
第 4 個(gè)參數(shù)是字符串紧唱,調(diào)用 對(duì)象.屬性.__doc__ ,此參數(shù)是該屬性的描述信息
class Person(object):
? ? def __init__(self,name):
? ? ? ? ? self.name = name
? ? def get_name(self):
? ? ? ? ? return self.name
? ? def set_name(self,new_name):
? ? ? ? ? self.name = new_name
? ? ? ? ? print("設(shè)置名字為:%s"%self.name)
? ? def del_name(self):
? ? ? ? ? del? self.name
? ? BAR = property(get_name,set_name,del_name,"價(jià)格信息...")
person = Person("小王")
person.BAR? ? ? # 自動(dòng)調(diào)用第一個(gè)參數(shù)中定義的方法:get_name
person.BAR = "小李" # 自動(dòng)調(diào)用第二個(gè)參數(shù)中定義的方法:set_name方法隶校,并將 "小李" 當(dāng)作參數(shù)傳入
person.del_name? # 自動(dòng)調(diào)用第三個(gè)參數(shù)中定義的方法:del_name方法
desc = Person.BAR.__doc__? # 自動(dòng)獲取第四個(gè)參數(shù)中設(shè)置的值:描述信息...
print("描述是:%s"%desc)
由于類屬性方式創(chuàng)建 property屬性 具有3種訪問方式漏益,我們可以根據(jù)它們幾個(gè)屬性的訪問特點(diǎn),分別將?三個(gè)方法定義為對(duì)同一個(gè)屬性:獲取深胳、修改绰疤、刪除,如下商品的價(jià)格
class Goods(object):
? ? def __init__(self):
? ? ? ? # 原價(jià)
? ? ? ? self.original_price = 100
? ? ? ? # 折扣
? ? ? ? self.discount = 0.8
? ? def get_price(self):
? ? ? ? # 實(shí)際價(jià)格 = 原價(jià) * 折扣
? ? ? ? new_price = self.original_price * self.discount
? ? ? ? return new_price
? ? def set_price(self, value):
? ? ? ? self.original_price = value
? ? def del_price(self):
? ? ? ? del self.original_price
? ? PRICE = property(get_price, set_price, del_price, '價(jià)格屬性描述...')
obj = Goods()
obj.PRICE? ? ? ? # 獲取商品價(jià)格
obj.PRICE = 200? # 修改商品原價(jià)
del obj.PRICE? ? # 刪除商品原價(jià)
綜上所述
定義property屬性共有兩種方式,分別是【裝飾器】和【類屬性】舞终,而【裝飾器】方式針對(duì)經(jīng)典類和新式類又有所不同轻庆。
通過使用property屬性,能夠簡(jiǎn)化調(diào)用者在獲取數(shù)據(jù)的流程
作者:IIronMan
鏈接:http://www.reibang.com/p/e6bf47449f7e
來源:簡(jiǎn)書
著作權(quán)歸作者所有敛劝。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)余爆,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。