1. 程式人生 > 實用技巧 >staticmethod寫和不寫有什麼區別?【轉】

staticmethod寫和不寫有什麼區別?【轉】

系統學python語法是好幾年之前的事情了,印象中就是Python的黑魔法真的挺多的,一般你也用不到。

今天就來講一下staticmethod這個裝飾器,是我這兩天一直想記錄下來的一個怪里怪氣的東西。

網上一般都說類靜態方法要@staticmethod,而我實際試驗不寫也沒啥問題的樣子:

# -*- coding: utf-8 -*-
 
class haha:
    def x():
        print('x')
 
haha.x()

我們知道在python中一切皆是物件,所以haha類自身也是一個物件,上面的程式碼和下面等價:

# -*- coding: utf-8 -*-
class haha: pass def x(): print('x') haha.x = x haha.x()

就是往物件上賦值一個屬性,儲存一個函式。

既然這樣就可以實現靜態函數了,那還要staticmethod幹嘛?看下面的報錯就知道了:

# -*- coding: utf-8 -*-
 
class haha:
    def x():
        print('x')
 
 
obj = haha()
obj.x()
 
 
Traceback (most recent call last):
  File "/Users/liangdong/Documents/gitlab/try/main.py
", line 9, in <module> obj.x() TypeError: x() takes 0 positional arguments but 1 was given

通過類物件呼叫靜態方法,python會自動加一個self到第一引數,而我們希望x()函式是靜態方法,不需要self。

這時候就需要@staticmethod來影響這個行為了:

# -*- coding: utf-8 -*-
 
class haha:
    @staticmethod
    def x():
        print('x')
 
 
obj = haha()
obj.x()
haha.x()

加上@staticmethod的haha類,無論是類還是物件都可以呼叫到x()方法,終於符合了類靜態方法的正常行為表現。

轉自

staticmethod寫和不寫有什麼區別? | 魚兒的部落格
https://yuerblog.cc/2018/10/29/why-use-staticmethod/