python類內(nèi)靜態(tài)函數(shù) python 靜態(tài)類

python 里面有靜態(tài)函數(shù)嗎

python的類里用@staticmethod的是靜態(tài)方法,@classmethod的是類方法,如下

為企業(yè)提供網(wǎng)站制作、成都網(wǎng)站建設(shè)、網(wǎng)站優(yōu)化、全網(wǎng)整合營銷推廣、競價(jià)托管、品牌運(yùn)營等營銷獲客服務(wù)。創(chuàng)新互聯(lián)公司擁有網(wǎng)絡(luò)營銷運(yùn)營團(tuán)隊(duì),以豐富的互聯(lián)網(wǎng)營銷經(jīng)驗(yàn)助力企業(yè)精準(zhǔn)獲客,真正落地解決中小企業(yè)營銷獲客難題,做到“讓獲客更簡單”。自創(chuàng)立至今,成功用技術(shù)實(shí)力解決了企業(yè)“網(wǎng)站建設(shè)、網(wǎng)絡(luò)品牌塑造、網(wǎng)絡(luò)營銷”三大難題,同時(shí)降低了營銷成本,提高了有效客戶轉(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]

python 類方法和靜態(tài)方法的區(qū)別

面相對象程序設(shè)計(jì)中,類方法和靜態(tài)方法是經(jīng)常用到的兩個(gè)術(shù)語。

邏輯上講:類方法是只能由類名調(diào)用;靜態(tài)方法可以由類名或?qū)ο竺M(jìn)行調(diào)用。

在C++中,靜態(tài)方法與類方法邏輯上是等價(jià)的,只有一個(gè)概念,不會(huì)混淆。

而在python中,方法分為三類實(shí)例方法、類方法、靜態(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(); # 錯(cuò)誤,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); # 錯(cuò)誤 classFun() takes exactly 1 argument (2 given)

可以看到,在python中,兩種方法的主要區(qū)別在于參數(shù)。實(shí)例方法隱含的參數(shù)為類實(shí)例self,而類方法隱含的參數(shù)為類本身cls。

靜態(tài)方法無隱含參數(shù),主要為了類實(shí)例也可以直接調(diào)用靜態(tài)方法。

所以邏輯上類方法應(yīng)當(dāng)只被類調(diào)用,實(shí)例方法實(shí)例調(diào)用,靜態(tài)方法兩者都能調(diào)用。主要區(qū)別在于參數(shù)傳遞上的區(qū)別,實(shí)例方法悄悄傳遞的是self引用作為參數(shù),而類方法悄悄傳遞的是cls引用作為參數(shù)。

python實(shí)現(xiàn)了一定的靈活性使得類方法和靜態(tài)方法,都能夠被實(shí)例和類二者調(diào)用

Python中靜態(tài)方法和類方法的區(qū)別是什么'>lt;譯文>Python中靜態(tài)方法和類方法的區(qū)別是什么

要在類中使用靜態(tài)方法,需在類成員函數(shù)前面加上@staticmethod標(biāo)記符,以表示下面的成員函數(shù)是靜態(tài)函數(shù)。使用靜態(tài)方法的好處是,不需要定義實(shí)例即可使用這個(gè)方法。另外,多個(gè)實(shí)例共享此靜態(tài)方法。

普通的類方法需要對象實(shí)例化之后才能調(diào)用 。

Python中靜態(tài)方法和類方法的區(qū)別

一、先是在語法上面的區(qū)別:

1、靜態(tài)方法不需要傳入self參數(shù),類成員方法需要傳入代表本類的cls參數(shù);

2、靜態(tài)方法是無妨訪問實(shí)例變量和類變量的,類成員方法無法訪問實(shí)例變量但是可以訪問類變量

二、使用的區(qū)別:

由于靜態(tài)方法無法訪問類屬性,實(shí)例屬性,相當(dāng)于一個(gè)相對獨(dú)立的方法,跟類其實(shí)并沒有什么關(guān)系。這樣說來,靜態(tài)方法就是在類的作用域里的函數(shù)而已。

python 為什么要使用靜態(tài)方法

Python使用靜態(tài)方法類似函數(shù)工具使用,一般盡量少用靜態(tài)方法。

Python的靜態(tài)方法和類成員方法都可以被類或?qū)嵗L問,兩者概念不容易理清,但還是有區(qū)別的:

1)靜態(tài)方法無需傳入self參數(shù),類成員方法需傳入代表本類的cls參數(shù);

2)從第1條,靜態(tài)方法是無法訪問實(shí)例變量的,而類成員方法也同樣無法訪問實(shí)例變量,但可以訪問類變量;

3)靜態(tài)方法有點(diǎn)像函數(shù)工具庫的作用,而類成員方法則更接近類似Java面向?qū)ο蟾拍钪械撵o態(tài)方法。

類函數(shù)、成員函數(shù)、靜態(tài)函數(shù)、抽象函數(shù)、方法偽裝屬性

本篇博客是滾雪球?qū)W Python 第二輪的最后一篇博客,我們將內(nèi)容繼續(xù)提升到面向?qū)ο蟛糠?,為你補(bǔ)充類里面的一些裝飾器,學(xué)習(xí)之后,希望你的 Python 基礎(chǔ)知識(shí)可以更上一層樓。

先直接看代碼,再對代碼內(nèi)容進(jìn)行分析與學(xué)習(xí)。

首先要掌握的是類函數(shù)的定義格式,在普通函數(shù)的前面添加裝飾器 @classmethod ,該函數(shù)就會(huì)轉(zhuǎn)換為類函數(shù),同時(shí)函數(shù)的第一個(gè)參數(shù)默認(rèn)是 cls ,該變量名可以任意,建議使用成 cls ,這個(gè)是程序員之間的約定。

在 Python 中,大部分 @classmethod 裝飾的函數(shù)末尾都是 return cls(XXX) , return XXX.__new__ () 也就是 @classmethod 的一個(gè)主要用途是作為構(gòu)造函數(shù)。

先掌握一個(gè)概念,靜態(tài)函數(shù)不屬于它所在的那個(gè)類,它是獨(dú)立于類的一個(gè)單獨(dú)函數(shù),只是寄存在一個(gè)類名下,先建立這個(gè)基本概念,后面學(xué)起來就簡單很多了。

在同一個(gè)類中,調(diào)用靜態(tài)方法,使用 類名.函數(shù)名() 的格式。

先創(chuàng)建一個(gè)父類,其中包含兩個(gè)靜態(tài)函數(shù)與一個(gè)類函數(shù)。

再編寫一個(gè) S 類繼承自 F 類:

測試之后,基本結(jié)論如下:

如果在子類中覆蓋了父類的靜態(tài)函數(shù),那調(diào)用時(shí)使用的是子類自己的靜態(tài)函數(shù),

如果在子類中沒有覆蓋父類的靜態(tài)函數(shù),那調(diào)用時(shí)使用的是父類的靜態(tài)函數(shù),

類函數(shù)同樣遵循該規(guī)則。

如果希望在子類中調(diào)用父類的屬性或者函數(shù),請使用 父類名. 的形式實(shí)現(xiàn)。

被 @abstractmethod 裝飾的函數(shù)為抽象函數(shù),含抽象函數(shù)的類不能實(shí)例化,繼承了含抽象函數(shù)的子類必須覆蓋所有抽象函數(shù)裝飾的方法,未被裝飾的可以不重寫。

抽象類是一個(gè)特殊的類,它的特殊之處在于只能被繼承,不能被實(shí)例化,實(shí)現(xiàn)代碼如下:

抽象基類中學(xué)習(xí)還需要了解元類相關(guān)知識(shí),在第三輪滾雪球?qū)W Python 中將為你展開這部分內(nèi)容。

在 Python 面向?qū)ο蟮木幋a過程中, 對象.屬性 來獲取屬性的值,使用 對象.方法() 來調(diào)用方法,通過裝飾器 @property 可以將一個(gè)方法偽裝成屬性,從而使用 對象.方法 沒有括號(hào)的形式調(diào)用。代碼非常簡單:

這種寫法最直接的應(yīng)用,就是將部分屬性變成只讀屬性,例如,上述代碼,你無法通過下述代碼對 name 進(jìn)行修改。

如果希望方法偽裝的屬性具備修改和刪除功能,需要參考下述代碼:

上述代碼在將 name 方法偽裝成屬性之后,可以通過 @name.setter 和 @name.deleter 對同名的 name 方法進(jìn)行裝飾,從而實(shí)現(xiàn)了修改與刪除功能。

所以一般使用方法偽裝屬性的步驟是:

如果你覺得這個(gè)比較麻煩,還存在一種方法偽裝屬性的方式。使用 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://www.muchs.cn/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)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)