python的類里用@staticmethod的是靜態(tài)方法,@classmethod的是類方法,如下
為企業(yè)提供網(wǎng)站制作、成都網(wǎng)站建設(shè)、網(wǎng)站優(yōu)化、全網(wǎng)整合營銷推廣、競價托管、品牌運營等營銷獲客服務(wù)。創(chuàng)新互聯(lián)公司擁有網(wǎng)絡(luò)營銷運營團(tuán)隊,以豐富的互聯(lián)網(wǎng)營銷經(jīng)驗助力企業(yè)精準(zhǔn)獲客,真正落地解決中小企業(yè)營銷獲客難題,做到“讓獲客更簡單”。自創(chuàng)立至今,成功用技術(shù)實力解決了企業(yè)“網(wǎng)站建設(shè)、網(wǎng)絡(luò)品牌塑造、網(wǎng)絡(luò)營銷”三大難題,同時降低了營銷成本,提高了有效客戶轉(zhuǎn)化率,獲得了眾多企業(yè)客戶的高度認(rèn)可!
class?Person(object):
person_list?=?[]
def?__init__(self,?name,?age):
self.name?=?name
self.age?=?age
self.person_list.append(self)
@classmethod
def?one_year_later(cls):
for?p?in?cls.person_list:
p.age?+=?1
@staticmethod
def?born_one_boby(name):
return?Person(name,?0)
def?__repr__(self):
return?'Person?name:%s,?age:%s'?%?(self.name,?self.age)
if?__name__?==?'__main__':
petter?=??Person('Petter',23)
merry?=?Person('Merry',21)
print(petter)?#?Person?name:Petter,?age:23
print(merry)??#??Person?name:Merry,?age:21
Person.one_year_later()
print(petter)??#??Person?name:Petter,?age:24
print(merry)??#??Person?name:Merry,?age:22
baby?=?merry.born_one_boby('Tom')
print(Person.person_list)?#??[Person?name:Petter,?age:24,?Person?name:Merry,?age:22,?Person?name:Tom,?age:0]
面相對象程序設(shè)計中,類方法和靜態(tài)方法是經(jīng)常用到的兩個術(shù)語。
邏輯上講:類方法是只能由類名調(diào)用;靜態(tài)方法可以由類名或?qū)ο竺M(jìn)行調(diào)用。
在C++中,靜態(tài)方法與類方法邏輯上是等價的,只有一個概念,不會混淆。
而在python中,方法分為三類實例方法、類方法、靜態(tài)方法。代碼如下:
class Test(object):
def InstanceFun(self):
print("InstanceFun");
print(self);
@classmethod
def ClassFun(cls):
print("ClassFun");
print(cls);
@staticmethod
def StaticFun():
print("StaticFun");
t = Test();
t.InstanceFun();# 輸出InstanceFun,打印對象內(nèi)存地址“__main__.Test object at 0x0293DCF0”
Test.ClassFun(); # 輸出ClassFun,打印類位置 class '__main__.Test'
Test.StaticFun(); # 輸出StaticFun
t.StaticFun(); # 輸出StaticFun
t.ClassFun(); # 輸出ClassFun,打印類位置 class '__main__.Test'
Test.InstanceFun(); # 錯誤,TypeError: unbound method instanceFun() must be called with Test instance as first argument
Test.InstanceFun(t); # 輸出InstanceFun,打印對象內(nèi)存地址“__main__.Test object at 0x0293DCF0”
t.ClassFun(Test); # 錯誤 classFun() takes exactly 1 argument (2 given)
可以看到,在python中,兩種方法的主要區(qū)別在于參數(shù)。實例方法隱含的參數(shù)為類實例self,而類方法隱含的參數(shù)為類本身cls。
靜態(tài)方法無隱含參數(shù),主要為了類實例也可以直接調(diào)用靜態(tài)方法。
所以邏輯上類方法應(yīng)當(dāng)只被類調(diào)用,實例方法實例調(diào)用,靜態(tài)方法兩者都能調(diào)用。主要區(qū)別在于參數(shù)傳遞上的區(qū)別,實例方法悄悄傳遞的是self引用作為參數(shù),而類方法悄悄傳遞的是cls引用作為參數(shù)。
python實現(xiàn)了一定的靈活性使得類方法和靜態(tài)方法,都能夠被實例和類二者調(diào)用
要在類中使用靜態(tài)方法,需在類成員函數(shù)前面加上@staticmethod標(biāo)記符,以表示下面的成員函數(shù)是靜態(tài)函數(shù)。使用靜態(tài)方法的好處是,不需要定義實例即可使用這個方法。另外,多個實例共享此靜態(tài)方法。
普通的類方法需要對象實例化之后才能調(diào)用 。
一、先是在語法上面的區(qū)別:
1、靜態(tài)方法不需要傳入self參數(shù),類成員方法需要傳入代表本類的cls參數(shù);
2、靜態(tài)方法是無妨訪問實例變量和類變量的,類成員方法無法訪問實例變量但是可以訪問類變量
二、使用的區(qū)別:
由于靜態(tài)方法無法訪問類屬性,實例屬性,相當(dāng)于一個相對獨立的方法,跟類其實并沒有什么關(guān)系。這樣說來,靜態(tài)方法就是在類的作用域里的函數(shù)而已。
Python使用靜態(tài)方法類似函數(shù)工具使用,一般盡量少用靜態(tài)方法。
Python的靜態(tài)方法和類成員方法都可以被類或?qū)嵗L問,兩者概念不容易理清,但還是有區(qū)別的:
1)靜態(tài)方法無需傳入self參數(shù),類成員方法需傳入代表本類的cls參數(shù);
2)從第1條,靜態(tài)方法是無法訪問實例變量的,而類成員方法也同樣無法訪問實例變量,但可以訪問類變量;
3)靜態(tài)方法有點像函數(shù)工具庫的作用,而類成員方法則更接近類似Java面向?qū)ο蟾拍钪械撵o態(tài)方法。
本篇博客是滾雪球?qū)W Python 第二輪的最后一篇博客,我們將內(nèi)容繼續(xù)提升到面向?qū)ο蟛糠郑瑸槟阊a充類里面的一些裝飾器,學(xué)習(xí)之后,希望你的 Python 基礎(chǔ)知識可以更上一層樓。
先直接看代碼,再對代碼內(nèi)容進(jìn)行分析與學(xué)習(xí)。
首先要掌握的是類函數(shù)的定義格式,在普通函數(shù)的前面添加裝飾器 @classmethod ,該函數(shù)就會轉(zhuǎn)換為類函數(shù),同時函數(shù)的第一個參數(shù)默認(rèn)是 cls ,該變量名可以任意,建議使用成 cls ,這個是程序員之間的約定。
在 Python 中,大部分 @classmethod 裝飾的函數(shù)末尾都是 return cls(XXX) , return XXX.__new__ () 也就是 @classmethod 的一個主要用途是作為構(gòu)造函數(shù)。
先掌握一個概念,靜態(tài)函數(shù)不屬于它所在的那個類,它是獨立于類的一個單獨函數(shù),只是寄存在一個類名下,先建立這個基本概念,后面學(xué)起來就簡單很多了。
在同一個類中,調(diào)用靜態(tài)方法,使用 類名.函數(shù)名() 的格式。
先創(chuàng)建一個父類,其中包含兩個靜態(tài)函數(shù)與一個類函數(shù)。
再編寫一個 S 類繼承自 F 類:
測試之后,基本結(jié)論如下:
如果在子類中覆蓋了父類的靜態(tài)函數(shù),那調(diào)用時使用的是子類自己的靜態(tài)函數(shù),
如果在子類中沒有覆蓋父類的靜態(tài)函數(shù),那調(diào)用時使用的是父類的靜態(tài)函數(shù),
類函數(shù)同樣遵循該規(guī)則。
如果希望在子類中調(diào)用父類的屬性或者函數(shù),請使用 父類名. 的形式實現(xiàn)。
被 @abstractmethod 裝飾的函數(shù)為抽象函數(shù),含抽象函數(shù)的類不能實例化,繼承了含抽象函數(shù)的子類必須覆蓋所有抽象函數(shù)裝飾的方法,未被裝飾的可以不重寫。
抽象類是一個特殊的類,它的特殊之處在于只能被繼承,不能被實例化,實現(xiàn)代碼如下:
抽象基類中學(xué)習(xí)還需要了解元類相關(guān)知識,在第三輪滾雪球?qū)W Python 中將為你展開這部分內(nèi)容。
在 Python 面向?qū)ο蟮木幋a過程中, 對象.屬性 來獲取屬性的值,使用 對象.方法() 來調(diào)用方法,通過裝飾器 @property 可以將一個方法偽裝成屬性,從而使用 對象.方法 沒有括號的形式調(diào)用。代碼非常簡單:
這種寫法最直接的應(yīng)用,就是將部分屬性變成只讀屬性,例如,上述代碼,你無法通過下述代碼對 name 進(jìn)行修改。
如果希望方法偽裝的屬性具備修改和刪除功能,需要參考下述代碼:
上述代碼在將 name 方法偽裝成屬性之后,可以通過 @name.setter 和 @name.deleter 對同名的 name 方法進(jìn)行裝飾,從而實現(xiàn)了修改與刪除功能。
所以一般使用方法偽裝屬性的步驟是:
如果你覺得這個比較麻煩,還存在一種方法偽裝屬性的方式。使用 property 函數(shù),原型如下
通過上述函數(shù)將方法偽裝成屬性的代碼為:
滾雪球?qū)W Python 第二輪 15 篇博客在一次結(jié)束了,下一輪將在 4 月中旬再次開啟,學(xué) Python 我們一直在路上,希望本系列的課程對你的 Python 學(xué)習(xí)有所助力。
本文名稱:python類內(nèi)靜態(tài)函數(shù) python 靜態(tài)類
鏈接URL:http://jinyejixie.com/article36/dosshsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、ChatGPT、營銷型網(wǎng)站建設(shè)、域名注冊、Google、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)