python---之cls,和self
作者:秦風
轉載:連結:https://www.zhihu.com/question/49660420/answer/335991541
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
轉載:連結:https://www.zhihu.com/question/49660420/answer/335991541
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
一般來說,要使用某個類的方法,需要先例項化一個物件再呼叫方法。
而使用@staticmethod或@classmethod,就可以不需要例項化,直接類名.方法名()來呼叫。
這有利於組織程式碼,把某些應該屬於某個類的函式給放到那個類裡去,同時有利於名稱空間的整潔。
class A(object):
a = 'a'
@staticmethod
def foo1(name):
print 'hello', name
def foo2(self, name):
print 'hello', name
@classmethod
def foo3(cls, name):
print 'hello', name
首先定義一個類A,類A中有三個函式,foo1為靜態函式,用@staticmethod裝飾器裝飾,這種方法與類有某種關係但不需要使用到例項或者類來參與。如下兩種方法都可以正常輸出,也就是說既可以作為類的方法使用,也可以作為類的例項的方法使用。
a = A()
a.foo1('mamq') # 輸出: hello mamq
A.foo1('mamq')# 輸出: hello mamq
foo2為正常的函式,是類的例項的函式,只能通過a呼叫。
a.foo2('mamq') # 輸出: hello mamq
A.foo2('mamq') # 報錯: unbound method foo2() must be called with A instance as first argument (got str instance instead)
foo3為類函式,cls作為第一個引數用來表示類本身. 在類方法中用到,類方法是隻與類本身有關而與例項無關的方法。如下兩種方法都可以正常輸出。
a.foo3('mamq') # 輸出: hello mamq
A.foo3('mamq') # 輸出: hello mamq
但是通過例子發現staticmethod與classmethod的使用方法和輸出結果相同,再看看這兩種方法的區別。
既然@staticmethod和@classmethod都可以直接類名.方法名()來呼叫,那他們有什麼區別呢
從它們的使用上來看,
@staticmethod不需要表示自身物件的self和自身類的cls引數,就跟使用函式一樣。
@classmethod也不需要self引數,但第一個引數需要是表示自身類的cls引數。
如果在@staticmethod中要呼叫到這個類的一些屬性方法,只能直接類名.屬性名或類名.方法名。
而@classmethod因為持有cls引數,可以來呼叫類的屬性,類的方法,例項化物件等,避免硬編碼。
也就是說在classmethod中可以呼叫類中定義的其他方法、類的屬性,但staticmethod只能通過A.a呼叫類的屬性,但無法通過在該函式內部呼叫A.foo2()。修改上面的程式碼加以說明:
class A(object):
a = 'a'
@staticmethod
def foo1(name):
print 'hello', name
print A.a # 正常
print A.foo2('mamq') # 報錯: unbound method foo2() must be called with A instance as first argument (got str instance instead)
def foo2(self, name):
print 'hello', name
@classmethod
def foo3(cls, name):
print 'hello', name
print A.a
print cls().foo2(name)
總結:其實就是staticmethod,這個方法,不能在類內呼叫其他的類的方法
而classmethod可以呼叫其他的方法,因為有cls這個引數。
staticmethod 與classmethod的方法與self這個方法的區別,就是self必須使用例項化物件,也就是a=A(),a.方法()
而另外兩個方法只用,A.方法()即可
相關文章
- python---之物件導向selfPython物件
- Python - 關於類(self/cls) 以及 多程式通訊的思考Python
- python---之yamlPythonYAML
- python---之iterPython
- python---之nan,infPythonNaN
- &self 和 self 的區別
- python---之numpy.pad()Python
- python---之sorted函式Python函式
- rust語法super、self和SelfRust
- python---之if _name_ == '_main_'PythonAI
- 為什麼 super().__new__(cls, name, bases, dct) 中的 cls 是顯式傳遞的,而不是像 self 那樣隱式傳遞
- python---之table寫hdf5檔案Python
- 檔案包含之/proc/self/environ
- iOS[super class]和[self class]iOS
- Python---字典方法Python
- self::class和static::class的區別
- python---多工程式Python
- python---字典遍歷Python
- The Tokenizers Summary: [EOS],[BOS],[CLS],[SEP]
- Objective-C中的self和super理解Object
- PHP new self()和new static()的區別PHP
- python---函式定義Python函式
- python--- 之The program 'python' can be found in the following packages: * python-minimal * python3PythonPackage
- python---核心知識12之物件導向三大特性補充Python物件
- 自我覺知和自我知覺(self-perception)
- new static ,new self ,self::, $this的一些理解
- # self小記
- window.self
- self-introduction
- python---之編譯型語言和解釋型語言的區別Python編譯
- Self-Attention GAN 中的 self-attention 機制
- 頁面CLS 最佳化實踐
- CTS、CLS、CLR分別作何解釋?
- PHP 中 bind 的用法 self 和 static 的區別PHP
- 關於PHP this 和 self 呼叫類方法的區別PHP
- python---函式引數、變數Python函式變數
- CSS align-selfCSS
- Self-supervised Learning