相信 Python 程序員多多少少都和我同樣遇到過 Method Unbound Error,直譯過來就是 「方法未綁定錯誤」,雖然搜索以後知道了使用 @classmethod
這樣的裝飾起後就能夠解決問題, 可是一直沒有獲得徹底解惑。程序員
咱們知道,Python 是一個動態語言,在類的建立過程當中甚至實例化之後都能動態地修改其方法、 屬性,這種作法一般被稱爲「Monkey Patching」,雖然咱們並不提倡 MP,可是 Python 在建立類的過程當中確實就是基於相似原理進行的方法綁定,類方法的綁定一般是在 __new__
中,咱們在建立元類時,一般也會覆蓋該方法。函數
另外一個概念,也是在使用 Python 以前一直未能透徹理解的概念,「方法是一種特殊的函數」, 在這裏明確無疑!對於通常的方法 normal_method(self, *args, **kwargs)
咱們一般都是在類中定義,而後在調用類的實例對象時動態地將對象自己做爲做爲第一個參數傳入, 所以在調用沒有聲明 self 變量的方法時就會遇到這樣的錯誤:code
class C: def normal_method(): pass # TypeError: normal_method() takes no arguments (1 given)
注意這裏的 self
只是一個變量名的約定,你能夠替換爲任何非系統保留字。orm
這樣的方法在定義的適合就依賴於實例對象了,也就是綁定在了實例對象上,然而實例化以前 方法並無 self
能夠綁定,因而就會出現 Method Unbound Error。 相似的,類方法也是這樣自動地將類對象傳入方法的 Bound Method。那麼 Python 是如何知道 何時傳入實例對象,什麼適合傳遞類對象的呢?答案就在這個 @classmethod
中。對象
除了上面實例方法和類方法兩類 Bound Method,還有對應的 Unbound Method,也就是不須要 self 或者 cls 進行綁定的方法,這就是 static method,經過 @staticmethod
忽略掉 方法接受的第一個參數。class