python中類似c++靜態方法的一個記錄
個人學習c++出身,在後面的工作中接觸到python,見到一些classmethod的字眼有點疑惑,所以進行一些記錄。
都知道的是,c/c++中有着靜態成員,靜態方法的存在,比如:
class A:
{
static int a;
public:
static void hello(){printf("Hello, world.\n")}
};
int main() {
A a;
a.hello(); //錯誤調用
A::hello(); //正確調用
return 0;
}
上面就是關於一個靜態方法的一個聲明和使用,可以看到,靜態方法是直接綁定於對象,由類名加::加靜態方法名直接調用,是一種很方便的用法。
然後就是我在python中看到的一個使用:
class A:
@classmethod
def hello(cls):
print('hello, world')
>>> A.hello()
Hello, world
因為是看別人的代碼,項目太大,一下子不知道這個用法,後來才發現,這就是一個定義靜態方法的一個python實現,可以通過A.hello()來調用
因此這裡記錄一下,在需要定義這種靜態方法的時候,可以這樣定義,不過靜態方法的參數一定要是cls,不然使用就會報錯,如下:
class A:
@classmethod
def hello():
print('hello, world.')
>>> A.hello()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: A.hello() takes 0 positional arguments but 1 was given
如上,我們知道python類方法會在對象實例調用方法時,自動傳入對象參數,但這時候好像就不行了,因為它被classmethod修飾器確定為靜態方法,但cls的作用使得它不會自動傳入對象參數(類似c++的this指針)