欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中類方法@classmethod和靜態(tài)方法@staticmethod解析

 更新時(shí)間:2023年08月24日 10:53:35   作者:goodxin_ie  
這篇文章主要介紹了Python中類方法@classmethod和靜態(tài)方法@staticmethod解析,python中存在三種方法,分別為常規(guī)方法(定義中傳入self)、@classmethod修飾的類方法、@staticmethod修飾的靜態(tài)方法,,需要的朋友可以參考下

一、python中的方法

python中存在三種方法,分別為常規(guī)方法(定義中傳入self)、@classmethod修飾的類方法、@staticmethod修飾的靜態(tài)方法。

class A(object):
    num = 0
    def __init__(self, index = 0):
        self.index = index 
    def foo(self, x):
        print("executing foo(%s,%s)" % (self, x))
        print('self:', self)
    @classmethod
    def class_foo(cls, x):
        print("executing class_foo(%s,%s)" % (cls, x))
        print('cls:', cls.num)
    @staticmethod
    def static_foo(x):
        print("executing static_foo(%s)" % x)
a = A()

以上面的代碼為例,其中存在三種類型的方法。

1.常規(guī)方法foo()

常規(guī)方法定義時(shí)需要傳入self參數(shù),與類的實(shí)例綁定。

也就是說調(diào)用時(shí)需要先實(shí)例化類,然后該實(shí)例才擁有foo()方法,通過A().foo()的方式來調(diào)用。

不能直接用類A.foo()的方式來調(diào)用。

2.類方法class_foo()

用@classmethod修飾的方法需要傳入cls參數(shù)(代表當(dāng)前類),表示該方法與類綁定(不是實(shí)例)

在該函數(shù)內(nèi)部可以調(diào)用屬于類的專有屬性(一般來說定義在__init__外面的屬性如上面的num)。

可以直接用A.class_foo()來調(diào)用,當(dāng)然也可以直接實(shí)例化,通過實(shí)例來調(diào)用。

3.靜態(tài)方法static_foo()

用@staticmethod修飾的方法不需要傳入任何參數(shù)

該方法內(nèi)部不能訪問類或者實(shí)例的屬性,相當(dāng)于定義在類外面的普通方法。

可以直接用A.static_foo()來調(diào)用或者通過實(shí)例來調(diào)用。

二、@classmethod和@staticmethod的異同

相同點(diǎn):

  • 都可以直接用類名.方法(A.xx())的方式來訪問,也可以通過實(shí)例來訪問

不同點(diǎn):

  • 構(gòu)造時(shí)classmethod需要傳入cls參數(shù),staticmethod不需要
  • classmethod可以通過cls.來訪問類的專有屬性,staticmethod不能訪問類的屬性
  • classmethod可以被子類繼承,能夠判斷出是父類還是子類調(diào)用

三、使用場(chǎng)景

1.classmethod用在構(gòu)造前交互(即類實(shí)例化之前),一般是用來實(shí)現(xiàn)特殊的構(gòu)造函數(shù)。

e.g我們定義了Date類,需要提供day,month,year三個(gè)參數(shù)進(jìn)行初始化。

class Date(object):
    day = 0
    month = 0
    year = 0
    def __init__(self, day=0, month=0, year=0):
        self.day = day
        self.month = month
        self.year = year

但是如果我們有很多 ('dd-mm-yyyy') 格式字符串的日期信息,想要把它們創(chuàng)建成 Date 類實(shí)例。

此時(shí)我們需要將 ('dd-mm-yyyy')轉(zhuǎn)化成三個(gè)整形變量

然后 通過傳遞這些值實(shí)例化 Date。

我們當(dāng)然可以在函數(shù)外面做轉(zhuǎn)化的事,然后去實(shí)例化

如下:

day, month, year = map(date_as_string.split('-'))
date1 = Date(day, month, year)

但是很明顯轉(zhuǎn)化這個(gè)功能放在類里面美觀一點(diǎn),但是一般的方法需要類實(shí)例化之后(調(diào)用了__init__之后)才可以使用,因此這里需要使用@classmethod

class Date(object):
    day = 0
    month = 0
    year = 0
    def __init__(self, day=0, month=0, year=0):
        self.day = day
        self.month = month
        self.year = year
    @classmethod
    def from_string(cls, date_as_string):
        day, month, year = map(date_as_string.split('-'))
        date1 = cls(day, month, year)
        return date1
date2 = Date.from_string('11-09-2012')

通過date2 = Date.from_string('11-09-2012')這樣的方式就可以生成一個(gè)實(shí)例了。

2.某些不與實(shí)例交互的方法

不與實(shí)例交互就可以完成功能的方法雖然可以通過普通的實(shí)例化方法實(shí)現(xiàn)

但是實(shí)例化之后會(huì)浪費(fèi)更多的時(shí)間與空間。

因此使用staticmethod。

ps:staticmethod方法和一個(gè)定義在lei外面的函數(shù)沒啥區(qū)別,為了美觀和整潔才移到函數(shù)里面的。

到此這篇關(guān)于Python中類方法@classmethod和靜態(tài)方法@staticmethod解析的文章就介紹到這了,更多相關(guān)Python類方法和靜態(tài)方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python答題卡識(shí)別并給出分?jǐn)?shù)的實(shí)現(xiàn)代碼

    Python答題卡識(shí)別并給出分?jǐn)?shù)的實(shí)現(xiàn)代碼

    本文帶領(lǐng)大家學(xué)習(xí)Python答題卡識(shí)別并給出分?jǐn)?shù)的實(shí)現(xiàn)代碼,代碼實(shí)現(xiàn)思路清晰,簡(jiǎn)單易懂,Python識(shí)別答題卡相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-06-06
  • python pandas 組內(nèi)排序、單組排序、標(biāo)號(hào)的實(shí)例

    python pandas 組內(nèi)排序、單組排序、標(biāo)號(hào)的實(shí)例

    下面小編就為大家分享一篇python pandas 組內(nèi)排序、單組排序、標(biāo)號(hào)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Linux下Python獲取IP地址的代碼

    Linux下Python獲取IP地址的代碼

    這篇文章主要介紹了Linux下Python獲取IP地址的代碼,需要的朋友可以參考下
    2014-11-11
  • 解決pandas中讀取中文名稱的csv文件報(bào)錯(cuò)的問題

    解決pandas中讀取中文名稱的csv文件報(bào)錯(cuò)的問題

    今天小編就為大家分享一篇解決pandas中讀取中文名稱的csv文件報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Flask實(shí)現(xiàn)跨域請(qǐng)求的處理方法

    Flask實(shí)現(xiàn)跨域請(qǐng)求的處理方法

    這篇文章主要介紹了Flask實(shí)現(xiàn)跨域請(qǐng)求的處理方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • python+django+selenium搭建簡(jiǎn)易自動(dòng)化測(cè)試

    python+django+selenium搭建簡(jiǎn)易自動(dòng)化測(cè)試

    這篇文章主要介紹了python+django+selenium搭建簡(jiǎn)易自動(dòng)化測(cè)試,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 詳解如何用Python登錄豆瓣并爬取影評(píng)

    詳解如何用Python登錄豆瓣并爬取影評(píng)

    這篇文章主要介紹了如何用Python登錄豆瓣并爬取影評(píng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Python基礎(chǔ)篇之字符串方法總結(jié)

    Python基礎(chǔ)篇之字符串方法總結(jié)

    Python提供了豐富的字符串處理方法,可以方便地對(duì)字符串進(jìn)行操作、處理和轉(zhuǎn)換。在本文中,我們將介紹Python中常用的字符串方法,需要的可以參考一下
    2023-04-04
  • Python線性網(wǎng)絡(luò)實(shí)現(xiàn)分類糖尿病病例

    Python線性網(wǎng)絡(luò)實(shí)現(xiàn)分類糖尿病病例

    什么是線性規(guī)劃?想象一下,您有一個(gè)線性方程組和不等式系統(tǒng)。這樣的系統(tǒng)通常有許多可能的解決方案。線性規(guī)劃是一組數(shù)學(xué)和計(jì)算工具,可讓您找到該系統(tǒng)的特定解,該解對(duì)應(yīng)于某些其他線性函數(shù)的最大值或最小值
    2022-10-10
  • Python入門教程(十一)Python中的運(yùn)算符

    Python入門教程(十一)Python中的運(yùn)算符

    這篇文章主要介紹了Python入門教程(十一)Python中的運(yùn)算符,Python是一門非常強(qiáng)大好用的語言,也有著易上手的特性,本文為入門教程,需要的朋友可以參考下
    2023-04-04

最新評(píng)論