Posted on 2014-04-16 12:01
小夜 閱讀(410)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
[52] Python
最近專職做起了Python,得積累些Python的知識(shí)。
-----------------
閱讀代碼的時(shí)候,看到了classmethod。staticmethod用的挺多,classmethod一直沒用過,感覺有些迷惑。
Google了一篇文章,講的挺清楚:
pyhton靜態(tài)方法和類方法。上面這篇文章主要講原理,我這里主要說說二者的相同和區(qū)別。
- 都可以通過類調(diào)用;
- 都可以通過對(duì)象調(diào)用;
- 都可以繼承和復(fù)寫;
- 都可以使用類屬性、類方法和類的靜態(tài)方法;
- 使用這些屬性或方法時(shí),staticmethod必須直接通過類名進(jìn)行調(diào)用,classmethod可以優(yōu)雅的通過參數(shù)cls調(diào)用。
在進(jìn)行屬性或方法調(diào)用時(shí):staticmethod需要硬編碼指明方法的類,如果存在繼承,無法使用子類復(fù)寫的方法和屬性,比較適合用于對(duì)其他方法和屬性不依賴或依賴較少的情況;classmethod通過cls進(jìn)行調(diào)用,這個(gè)cls是調(diào)用時(shí)傳入的類,可以是父類,也可以是子類,適合用于對(duì)其他方法和屬性依賴較多的情況,也適用于需要通過集成擴(kuò)展的情況。
下面的代碼,簡(jiǎn)單試驗(yàn)了兩者的區(qū)別,并通過staticmethod簡(jiǎn)單的模擬了classmethod的操作:
class Base(object):
name = "Base"
@classmethod
def foo(cls):
print cls.name
@staticmethod
def foo_static1():
print Base.name
@staticmethod
def foo_static2(cls):
print cls.name
@staticmethod
def foo_static3(cls):
# if not isinstance(cls, type):
if isinstance(cls, Base):
cls = cls.__class__
print cls.name
class A(Base):
name = "A"
def __init__(self):
self.name = "I am '%s'" % A.name
class B(Base):
name = "B"
def __init__(self):
self.name = "I am '%s'" % B.name
@classmethod
def foo(cls):
print "<%s>" % cls.name
@staticmethod
def foo_static1():
print "<%s>" % Base.name
def testA():
obj = A()
obj.foo()
obj.foo_static1()
obj.foo_static2(A)
obj.foo_static2(obj)
obj.foo_static3(A)
obj.foo_static3(obj)
A.foo()
A.foo_static1()
def testB():
obj = B()
obj.foo()
obj.foo_static1()
def run_test(func, *args, **kwargs):
print "======================="
func(*args, **kwargs)
print ""
if __name__ == '__main__':
run_test(testA)
run_test(testB)