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指針)