2021年12月28日 星期二

Python:比較 classmethod 與 staticmethod

在 Python 中 classmethod 與 staticmethod 皆為 function decorator(請參考前文)。classmethod 第一個 argument 為 class,通常可用來寫 constructor 的 wrapper。而 staticmethod 就只是個普通的函數,並沒有 object instance 或 class 的資訊,因此許多資料中都認為 staticmethod 並不實用。以下為 [1]中的一個例子:
class A(object):
    def foo(self, x):
        print(f"executing foo({self}, {x})")

    @classmethod
    def class_foo(cls, x):
        print(f"executing class_foo({cls}, {x})")

    @staticmethod
    def static_foo(x):
        print(f"executing static_foo({x})")

a = A()
a.foo(1) # executing foo(__main__ .a="" 0xb7db="" at="" object="", 1)
a.class_foo(1) # executing class_foo(class main__.a="", 1)
A.class_foo(1) # executing class_foo(class main__.a="", 1)
a.static_foo(1) # executing static_foo(1)
A.static_foo('hi') # executing static_foo(hi)

參考資料

[1] Difference between staticmethod and classmethod

沒有留言:

張貼留言