staticmethod寫和不寫有什麼區別?【轉】
阿新 • • 發佈:2020-09-15
系統學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/