那麼,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
zzz.normal_method(zzz) # needs to specify self class
回覆刪除似乎應該是
zzz.normal_method(zzz())?
self 應該是指 instance
基本上 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>