2014-12-08

python @classmethod and @ staticmethod 的不同(筆記)

大家都知道我們可以把類別(class)裡的方法(method)設置為 static(靜態),這樣我們就可以直接使用該 method, 而不需要去產生(new)一個class出來

那麼,python是否也有同樣功能呢?

有的,從 python 2.2 後
python 提供了 @classmethod 跟 @staticmethod 二種方法。

二種都可以直接被呼叫
不同的是
staticmethod 是真的 static, 而 classmethod則是介於 normal 及 static 中間的產物
staticmethod 不用帶 self 參數
classmethod 則需承接第一個參數,而第一個參數則為該 method 的 class(被偷偷new出來的class)

廢話少說,看 code 就明白


class zzz():
    zoo = "zoo"

    @classmethod
    def foo(clss, name):
        print("hi! %s, it's classmethod." % name)
        print("zoo =", clss.zoo)

    @staticmethod
    def bar(name):
        print("hi! %s, it's staticmethod ." % name)
        print("zoo =", zzz.zoo)

    def normal_method(self):
        print("It's normal_method.")
        print("zoo =", self.zoo)

zzz.foo("mission")
print("="*20)
zzz.bar("mission")
print("="*20)
zzz().normal_method()
print("="*20)
zzz.normal_method(zzz
# needs to specify self class

[輸出]

hi! mission, it's classmethod.
zoo = zoo
====================
hi! mission, it's staticmethod .
zoo = zoo
====================
It's normal_method.
zoo = zoo
====================
It's normal_method.
zoo = zoo




註:static 跟 normal function 的存取方式不同,大家應該都知道吧?一個是被 new 出來的 instance,一個不用 new,故存取時要注意之間的不同。






http://www.biyibird.com

2 則留言:

  1. zzz.normal_method(zzz) # needs to specify self class
    似乎應該是
    zzz.normal_method(zzz())?
    self 應該是指 instance

    回覆刪除
    回覆
    1. 基本上 zzz.normal_method 用法就只是把它視為 "function" 使用,故這裡的 self 也只是 "參數" 的意思。在這裡,zzz 或 zzz() 都沒有太大意思,就是傳入的1個參數。
      >>> zzz.normal_method
      <function zzz.normal_method at 0x10e85e1e0>

      但是,當 normal_method 是被 instance 給呼叫時 預設第1個參數就是 instance 本身,即 self,故 zzz().normal_method() 毋需帶入參數,帶入參數反招錯誤

      從 shell 中 print 出來可看出上述各 method 彼此之不同
      >>> zzz.normal_method
      <function zzz.normal_method at 0x10e85e1e0>
      >>> zzz.foo
      <bound method zzz.foo of <class 'zzz'>>
      >>> zzz.bar
      <function zzz.bar at 0x10e85e268>

      刪除