先來解釋一下staticmethod和classmethod。直接一點來說,我們知道對於一個普通的類,我們要使用其中的函數的話,需要對類進行實例化,而一個類中,某個函數前面加上了staticmethod或者classmethod的話,那么這個函數就可以不通過實例化直接調用,什么意思呢?就是說有時候,我們需要把一些具有特定功能的函數放到一起,做成包導入Python程序,最好就是把他們放到一個類中,但是一個類每次我都要去實例化他,我覺得很麻煩,於是我在函數前面加上了@staticmethod,@classmethod,那么我下次用這個函數的功能的時候,可以直接用 類名.函數名 的形式了,這樣是不是省心多了?
- @staticmethod將函數轉換成為一個靜態方法,@classmethod將函數轉換成為一個類方法。
- @staticmethod不需要表示自身對象的self和自身類的cls參數,就跟使用函數一樣。
- @classmethod也不需要self參數,但第一個參數需要是表示自身類的cls參數。
- 如果在@staticmethod中要調用到這個類的一些屬性方法,只能直接類名.屬性名或類名.方法名。
- @classmethod因為持有cls參數,可以來調用類的屬性,類的方法,實例化對象等,避免硬編碼。
實例方法 | 類方法(classmethod) | 靜態方法(staticmethod) | |
定義方式 | self作為第一個參數 | cls作為第一個參數 | 無強制參數 |
綁定對象 | 類的實例 | 類 | 無 |
調用方式 | 只能通過類的實例調用 | 類對象或者類的實例均可調用 | 類對象或者類的實例均可調用 |
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019-04-04 12:46:46 # @Author : Your Name (you@example.org) # @Link : http://example.org # @Version : $Id$ class Test: def __init__(self, u): self.u = u print("類的初始化方法") def fun1(a, c): print("fun1: I' am instancemethod {}".format(c)) @staticmethod def fun2(): print("fun2: I' am staticmethod") Test("fdsf").fun1("call1") @classmethod def fun3(cls): print("fun3: I'am classmethod") cls("ooo").fun1("這樣調用") Test("a").fun1("I' am args") Test.fun2() Test.fun3()
參考:https://blog.csdn.net/ibelieve8013/article/details/83037996