[每日一題]2、Python中的類的定義和裝飾器@classmethod與@staticmethod

2021-03-03 Java專欄

掃碼關注『Python3X』

一個純粹的Python類公眾號

昨天推送的Python Every Day 1、因為寫完沒有仔細檢查有點問題。所以刪了。給大家說聲抱歉。

最近創建了一個GitHub項目,主要會分享一些Python方面面試題和練習題,

訪問地址:https://github.com/python3xxx/Python-Every-Day

(點擊閱讀原文,直達)

Python Every Day, 第 2 天

python中的定義類方法有三種形式

普通方法

類方法(@classmethod)

靜態方法(@staticmethod)

1、普通方法的使用


class A():
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def get_name(self):
        print('my name is', self.name)

    def get_age(self):
        print(f'i am {self.age} years old')


class B():
    def get_name(self, name):
        print('my name is', name)

    def get_age(self, age):
        print(f'i am {age} years old')


if __name__ == '__main__':
    a = A('tom',19)
    a.get_name()  
    a.get_age() 

    b = B()
    b.get_name('tom')  
    b.get_age(19) 


如上所示,創建普通的方法的方式有兩種(class A() & class B()).

class A() 中, __init__()是一個特殊的方法,相當於對A進行初始化,__init__ 中的self是對象A本身,name和age是它們的形參。

每次調用方法之前需要對類進行實例化, 例如 a = A('tom', 19)


2、類方法(@classmethod)


普通方法中,每次調用類中的方法,都需要先將類進行實例化,相對比較麻煩。如果類中的函數前面加上@classmethod 或者 @staticmethod,則就不用再進行實例化了。直接 名.函數名 進行調用

@classmethod不需要self來表示自身了,而是用了cls來代替。

示例如下:

class C():
    @classmethod
    def get_name(cls, name):
        print(cls)  
        print('my name is %s' % name) 

    @classmethod
    def get_age(cls, age):
        print(f'i am %s years old' % age)

if __name__ == '__main__':
    C.get_name('tom')  
    C.get_age(19) 

3、靜態方法(@staticmethod)

靜態方法也是通過 類名.函數名 的方式進行調用,與類方法類似,不同的是,靜態方法不需要表示自身對象的self或者cls作為參數,跟直接使用函數是一樣的。

class D():
    @staticmethod
    def get_name(name):
        print('my name is %s' % name)

    @staticmethod
    def get_age(age):
        print(f'i am %s years old' % age)

if __name__ == '__main__':
    D.get_name('tom')  
    D.get_age(19) 

總結

@staticmethod 與 @classmethod在Python中稱為 裝飾器,用來修飾函數,相當於添加一個額外的功能,比如不再像普通函數那樣進行實例化。通過使用裝飾器可以讓代碼更加整潔,易讀。用了修飾器之後,也可以進行實例化之後再調用,但是就顯得多此一舉了。


普通方法類方法(@classmethod)實例方法(@staticmethod)a = A()a.get_name()a.get_name()a.get_name()A不可用A.get_name()A.get_name()

相關焦點

  • Python中classmethod和staticmethod的區別
    今天來寫一下裝飾器classmethod和staticmethod這兩個關鍵詞。
  • python面向對象中的self,cls,staticmethod,classmethod
    span="">class '__main__.Person'>,hello,earthmanhello,earthman可以看到使用了classmethod或者staticmethod裝飾後的方法,調用有些不一樣,可以直接用類名.方法名()調用。
  • Python 中 staticmethod 和 classmethod 原理探究
    起步文章Python 中 property 的實現原理及實現中探究了 property 的實現原理。如果能理解那邊描述符的使用方式,那也能很快理解本篇中的 staticmethod 和 classmethod 。
  • Python的@staticmethod和@classmethod的作用與區別
    但是使用@staticmethod或@classmethod,就可以不需要實例化。所以@staticmethod或@classmethod作用:使用@staticmethod或@classmethod,就可以不需要實例化,直接類名.方法名()來調用。這有利於組織代碼,把某些應該屬於某個類的函數給放到那個類裡去,同時有利於命名空間的整潔。
  • 詳解Python的裝飾器
    >>> property()<property object at 0x10ff07940>@staticmethod,@classmethod有了@property裝飾器的了解,這兩個裝飾器的原理是差不多的。
  • Python 中的函數與方法 以及 Bound Method 和 Unbound Method
    從上面可以看出, 別的程式語言一樣, Function也是包含一個函數頭和一個函數體, 也同樣支持0到n個形參,而Method則是在function的基礎上, 多了一層類的關係, 正因為這一層類, 所以區分了 function 和 method.
  • python經典筆試、面試題
    一、高德軟體有限公司python試題及答案1. 在python中, list, tuple, dict, set有什麼區別, 主要應用在什麼樣的場景?靜態函數, 類函數, 成員函數、屬性函數的區別?定義:靜態函數(@staticmethod) : 即靜態方法,主要處理與這個類的邏輯關聯,它是不可以訪問實例變量或類變量的。類函數(@classmethod): 即類方法, 只能訪問類變量,不能訪問實例變量 , 類方法通過@classmethod裝飾器實現。
  • 很全的 Python 面試題
    >3 @staticmethod和@classmethodPython其實有3個方法,即靜態方法(staticmethod),類方法(classmethod)和實例方法,如下:def foo(x):    print "executing foo(%s)"%(x)class A(object):    def foo(self,x
  • Python-15-類的定義和使用
    類提供了一種組合數據和功能的方法。每個類的實例可以擁有保存自己狀態的屬性。一個類的實例也可以有改變自己狀態的(定義在類中的)方法。簡單的說,類就是一個事物的抽象描述。所以類中可以包含描述類的方法和屬性,其中方法又分為普通方法,類方法,靜態方法。詳細區別可查看Python的@staticmethod和@classmethod的作用與區別,今天主要介紹普通方法。
  • 詳解Python類中不同方法的應用
    主要是用來存放邏輯性的代碼,邏輯上屬於類,但是和類本身沒有關係,也就是說在靜態方法中,不會涉及到類中的屬性和方法的操作。可以理解為,靜態方法是個獨立的、單純的函數,它僅僅託管於某個類的名稱空間中,便於使用和維護。通常情況下,靜態方法使用@staticmethod裝飾器(或使用staticmethod())來聲明。
  • Python學習:類和實例
    但在Python3中,即使你採用類似classStudent:pass的方法沒有顯式繼承任何父類的定義了一個類,它也默認繼承object類。因為,object是Python3中所有類的基類。定義在類中,方法之外的變量,稱作類變量。
  • Python裝飾器以及高級用法
    介紹首先我要承認,裝飾器非常難!你在本教程中看到的一些代碼將會有一些複雜。大多數人在學習Python時都跟裝飾器做過鬥爭,所以如果這對你來說很奇怪,不要感到沮喪,因為同樣的大多數人都可以克服這種苦難。在本教程中,我將逐步介紹了解裝飾器的過程。首先我假設你已經可以編寫基本函數和基本類。
  • 《流暢的python》閱讀筆記(上)
    如果像判斷對象能否被調用, 可以使用內置的 callable() 函數進行判斷. python的數據模型中有7種可是可以被調用的:用戶定義的函數: 使用def語句或lambda表達式創建內置函數:如len內置方法:如dict.get方法:在類定義體中的函數類類的實例: 如果類定義了 __call__ , 那麼它的實例可以作為函數調用
  • Python 為什麼要保留顯式的 self ?
    在類的內部定義方法時,可能會產生幾種不同的方法:實例方法、類方法和 靜態方法。它們的作用和行為是不同的,那麼在定義和調用時怎麼做區分呢?當裝飾一個方法時,我們不知道是否要自動地給它加一個「self」參數:裝飾器可以將函數變成一個靜態方法(沒有「self」)或一個類方法(有一個有趣的 self,它指向一個類而不是一個實例),或者可以做一些完全不同的事情(用純 Python 實現「 @classmethod」或「 @staticmethod」的裝飾器是繁瑣的)。
  • Python奇技淫巧你知道多少?
    第三方package時, 並不希望代碼中所有的函數或者class可以被外部import, 在__init__.py中添加__all__屬性,該list中填寫可以import的類或者函數名, 可以起到限制的import的作用, 防止外部import其他函數或者類證明了會先執行__enter__方法, 然後調用with內的邏輯, 最後執行__exit__做退出處理, 並且, 即使出現異常也能正常退出
  • Python數據類型
    但我們通常使用類去實現, 這種方式定義方式略為繁瑣,  包括定義數據欄位, 初始化方法, __repr__用於友好顯示, __eq__ 用於判等, 還有一些默認值的處理等等, 另一方面定義類的話相對來說性能略差(其中涉及到類的實現) , 參考下方比較.
  • 咬一口Python(三)
    3.2.3 實例方法、類方法、靜態方法類方法分為普通方法,靜態方法和類方法,靜態方法和類方法可分別通過 classmethod和 staticmethod裝飾器來定義。class C:    def instance_method(self):        print(self)    @classmethod    def class_method(cls):        print(cls)    @staticmethod    def
  • Class or Static Variables in Python
    本節知識點:Python中 class 的  類變量與實例變量QQ圖片20200920105331基本概念 All objects share class or static variables.The class may have a static variable whose value is 「cse」 for all objects. And class may also have non-static members like name and roll.
  • Python為什麼要保留顯式的self?
    在類的內部定義方法時,可能會產生幾種不同的方法:實例方法、類方法和 靜態方法。它們的作用和行為是不同的,那麼在定義和調用時怎麼做區分呢?the method into the class:C.meth = meth請注意,我將「self」參數重命名為「myself」,以強調(在語法上)我們不是在此處定義一個方法(譯註:類外部的是函數,即 function,類內部的是方法,即 method)。
  • 去阿里面試Python,結果被這些高級語法考「焦」了
    如果不用裝飾器語法的話,定義可能會非常稀疏,並且不斷重複:class WithoutDecorators: def some_static_method(): print("this is static method") some_static_method = staticmethod(some_static_method