@staticmethod 和 @classmethod 用法
一般來說,要使用某個類的方法,需要先執行個體化一個對象再調用方法。
而使用@staticmethod或@classmethod,就可以不需要執行個體化,直接類名.方法名()來調用。
這有利于組織代碼,把某些應該屬于某個類的函數給放到那個類裡去,同時有利于命名空間的整潔。
既然@staticmethod和@classmethod都可以直接類名.方法名()來調用,那他們有什麼差別呢
從它們的使用上來看,
@staticmethod不需要表示自身對象的self和自身類的cls參數,就跟使用函數一樣。
@classmethod也不需要self參數,但第一個參數需要是表示自身類的cls參數。
如果在@staticmethod中要調用到這個類的一些屬性方法,隻能直接類名.屬性名或類名.方法名。
而@classmethod因為持有cls參數,可以來調用類的屬性,類的方法,執行個體化對象等,避免寫死。
下面上代碼。
class A(object):
bar = 1
def foo(self):
print 'foo'
@staticmethod
def static_foo():
print 'static_foo'
# 調用類自身參數
print A.bar
@classmethod
def class_foo(cls):
print 'class_foo'
#調用類自身參數
print cls.bar
cls().foo()
###執行
A.static_foo()
A.class_foo()
輸出
static_foo
1
class_foo
1
foo
self 和 cls 差別用法
普通的方法,第一個參數需要是self,它表示一個具體的執行個體本身。
如果用了staticmethod,那麼類方法就不需要這個self,而将這個方法當成一個普通的函數使用。
而對于classmethod,它的第一個參數不是self,是cls,它表示這個類本身。
class A(object):
def foo1(self):
print "Hello",self
@staticmethod
def foo2():
print "hello"
@classmethod
def foo3(cls):
print "hello",cls
>>> a = A()
# 最常見的調用方式,但與下面的方式相同
>>> a.foo1()
Hello # 這裡傳入執行個體a,相當于普通方法的self
# 等同于上面的方法
>>> A.foo1(a)
Hello # 這裡,由于靜态方法沒有參數,故可以不傳東西
>>> A.foo2()
hello
# 這裡,由于是類方法,是以,它的第一個參數為類本身。
>>> A.foo3()
hello #可以看到,直接輸入A,與上面那種調用傳回同樣的資訊。
# 是以,cls就是類本身。self是類的執行個體本身
>>> A
參考
https://blog.csdn.net/weixin_41923961/article/details/83097665
https://www.cnblogs.com/chllovegeyuting/archive/2013/03/14/2960532.html