python類的實(shí)例方法钓丰、靜態(tài)方法和類方法區(qū)別及其應(yīng)用場景

python類的實(shí)例方法炭剪、靜態(tài)方法和類方法區(qū)別及其應(yīng)用場景

一、先看語法先壕,python類語法中有三種方法瘩扼,實(shí)例方法谆甜、靜態(tài)方法,類方法集绰。

python中self, cls的區(qū)別

普通實(shí)例方法规辱,第一個參數(shù)需要是self,它表示一個具體的實(shí)例本身。
如果用了staticmethod栽燕,那么就可以無視self,而將這個方法當(dāng)成一個普通的函數(shù)使用罕袋。
而對于classmethod,它的第一個參數(shù)不是self,而是cls,它表示這個類本身碍岔。

# coding:utf-8
class Foo(object):
    """類三種方法語法形式"""
 
    def instance_method(self):
        print("是類{}的實(shí)例方法浴讯,只能被實(shí)例對象調(diào)用".format(Foo))
 
    @staticmethod
    def static_method():
        print("是靜態(tài)方法")
 
    @classmethod
    def class_method(cls):
        print("是類方法")
 
foo = Foo()
foo.instance_method()
foo.static_method()
foo.class_method()
print('----------------')
Foo.static_method()
Foo.class_method()

運(yùn)行結(jié)果如下:

是類<class '__main__.Foo'>的實(shí)例方法,只能被實(shí)例對象調(diào)用
是靜態(tài)方法
是類方法
----------------
是靜態(tài)方法
是類方法

說明:
實(shí)例方法只能被實(shí)例調(diào)用蔼啦,靜態(tài)方法(@由staticmethod裝飾器的方法)榆纽、類方法(由@classmethod裝飾器的方法),可以被類或類的實(shí)例對象調(diào)用捏肢。
1.實(shí)例方法奈籽,第一個參數(shù)必須要默認(rèn)傳遞實(shí)例對象,一般使用self鸵赫。
2.靜態(tài)方法衣屏,參數(shù)沒有必要。
3.類方法辩棒,第一個參數(shù)必須要默認(rèn)傳遞狼忱,一般使用cls。

二盗温、靜態(tài)方法藕赞、類方法使用區(qū)別或者說使用場景

1成肘、類方法用在模擬java定義多個構(gòu)造函數(shù)的情況卖局。

由于python類中只能有一個初始化方法,不能按照不同的情況初始化類双霍。

# coding:utf-8
class Book(object):
 
    def __init__(self, title):
        self.title = title
 
    @classmethod
    def class_method_create(cls, title):
        book = cls(title=title)
        return book
 
    @staticmethod
    def static_method_create(title):
        book= Book(title)
        return book
 
book1 = Book("use instance_method_create book instance")
book2 = Book.class_method_create("use class_method_create book instance")
book3 = Book.static_method_create("use static_method_create book instance")
print(book1.title)
print(book2.title)
print(book3.title)

特別說明砚偶,靜態(tài)方法也可以實(shí)現(xiàn)上面功能,當(dāng)靜態(tài)方法每次都寫上類名洒闸,就不方便使用染坯。

2、類中靜態(tài)方法方法調(diào)用靜態(tài)方法和類方法調(diào)用靜態(tài)方法例子丘逸。
下面的代碼单鹿,靜態(tài)方法調(diào)用另一個靜態(tài)方法,如果改用類方法調(diào)用靜態(tài)方法深纲,可以讓cls代替類仲锄,
讓代碼看起來精簡一些劲妙。也防止類名修改了,不用在類定義中修改原來的類名儒喊。

# coding:utf-8
class Foo(object):
    X = 1
    Y = 2
 
    @staticmethod
    def averag(*mixes):
        return sum(mixes) / len(mixes)
 
    @staticmethod
    def static_method():  # 在靜態(tài)方法中調(diào)用靜態(tài)方法
        print "在靜態(tài)方法中調(diào)用靜態(tài)方法"
        return Foo.averag(Foo.X, Foo.Y)
 
    @classmethod
    def class_method(cls):  # 在類方法中使用靜態(tài)方法
        print "在類方法中使用靜態(tài)方法"
        return cls.averag(cls.X, cls.Y)
 
foo = Foo()
print(foo.static_method())
print(foo.class_method())

結(jié)果如下:

在靜態(tài)方法中調(diào)用靜態(tài)方法
5
在類方法中使用靜態(tài)方法
5

3镣奋、繼承類中的區(qū)別

從下面代碼可以看出,如果子類繼承父類的方法怀愧,子類覆蓋了父類的靜態(tài)方法侨颈,
子類的實(shí)例繼承了父類的static_method靜態(tài)方法,調(diào)用該方法芯义,還是調(diào)用的父類的方法和類屬性哈垢。

子類的實(shí)例繼承了父類的class_method類方法,調(diào)用該方法扛拨,調(diào)用的是子類的方法和子類的類屬性温赔。

# coding:utf-8
class Foo(object):
    X = 1
    Y = 14
 
    @staticmethod
    def averag(*mixes):  # "父類中的靜態(tài)方法"
        return sum(mixes) / len(mixes)
 
    @staticmethod
    def static_method():  # "父類中的靜態(tài)方法"
        print "父類中的靜態(tài)方法"
        return Foo.averag(Foo.X, Foo.Y)
 
    @classmethod
    def class_method(cls):  # 父類中的類方法
        print "父類中的類方法"
        return cls.averag(cls.X, cls.Y)
 
 
class Son(Foo):
    X = 3
    Y = 5
 
    @staticmethod
    def averag(*mixes):  # "子類中重載了父類的靜態(tài)方法"
        print "子類中重載了父類的靜態(tài)方法"
        return sum(mixes) / 3
 
p = Son()
print "result of p.averag(1,5)"
print (p.averag(1,5))
print "result of p.static_method()"
print(p.static_method())
print "result of p.class_method()"
print(p.class_method())

運(yùn)行結(jié)果如下:

result of p.averag(1,5)
子類中重載了父類的靜態(tài)方法
2
result of p.static_method()
父類中的靜態(tài)方法
7
result of p.class_method()
父類中的類方法
子類中重載了父類的靜態(tài)方法
2
 
Process finished with exit code 0

參數(shù)地址:https://blog.csdn.net/helloxiaozhe/article/details/79940321

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鬼癣,隨后出現(xiàn)的幾起案子陶贼,更是在濱河造成了極大的恐慌,老刑警劉巖待秃,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拜秧,死亡現(xiàn)場離奇詭異,居然都是意外死亡章郁,警方通過查閱死者的電腦和手機(jī)枉氮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暖庄,“玉大人聊替,你說我怎么就攤上這事∨嗬” “怎么了惹悄?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肩钠。 經(jīng)常有香客問我泣港,道長,這世上最難降的妖魔是什么价匠? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任当纱,我火速辦了婚禮,結(jié)果婚禮上踩窖,老公的妹妹穿的比我還像新娘坡氯。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布箫柳。 她就那樣靜靜地躺著颓遏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滞时。 梳的紋絲不亂的頭發(fā)上叁幢,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音坪稽,去河邊找鬼曼玩。 笑死,一個胖子當(dāng)著我的面吹牛窒百,可吹牛的內(nèi)容都是我干的黍判。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼篙梢,長吁一口氣:“原來是場噩夢啊……” “哼顷帖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起渤滞,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤贬墩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后妄呕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陶舞,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年绪励,在試婚紗的時候發(fā)現(xiàn)自己被綠了肿孵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡疏魏,死狀恐怖停做,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情大莫,我是刑警寧澤蛉腌,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站葵硕,受9級特大地震影響眉抬,放射性物質(zhì)發(fā)生泄漏贯吓。R本人自食惡果不足惜懈凹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悄谐。 院中可真熱鬧介评,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坪仇,卻和暖如春杂腰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背椅文。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工喂很, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人皆刺。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓少辣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親羡蛾。 傳聞我的和親對象是個殘疾皇子漓帅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容