綁定方法與非綁定方法

類中定義函數分爲了兩大類,綁定方法與非綁定方法,它們有一些特殊之處:html

一、綁定方法特殊之處:綁定給誰就應該由誰來調用,誰來調用就會將誰當作第一個參數自動傳入ide

  綁定給對象的方法:這個在面向對象第一篇第六節就講到過(傳送門),在類中定義函數沒有被任何裝飾器修飾的狀況下,默認就是綁定對象的函數

  綁定給類的方法:爲類中定義函數添加一個裝飾器 classmethod,就是綁定類的工具

二、非綁定方法特殊之處:非綁定方法就是一個普通函數,既不與類綁定又不與對象綁定,意味着類與對象均可以調用,可是不管誰來調用都是一個普通函數,沒有自動傳值效果,非綁定方法就是爲類中定義函數添加一個裝飾器 staticmethodspa

 

類的綁定方法code

類中的方法,默認都是綁定給對象使用,因此須要採起一點措施,將類中的綁定方法解除對象綁定關係,進而綁定到類上,在 Python 中,引入了 classmethod 裝飾器,將類中的方法綁定到類身上htm

class People(): @classmethod def talk(cls): pass p = People() print(People.talk) # 運行
<bound method People.talk of <class '__main__.People'>>
View Code

從上述結果能夠看出,加上了一個裝飾器,將類中綁定給對象的方法,綁定到類身上了。以前分析過,若是一個方法綁定到誰身上,那麼在調用該函數的時候,將自動將該調用者看成第一個參數傳遞到函數中。可是,綁定到類的方法與綁定到對象方法有一點點不一樣:對象

class People: def __init__(self, name): self.name = name @classmethod def talk(cls): pass p = People('qiu') print(People.talk) print(p.talk) # 運行結果
<bound method People.talk of <class '__main__.People'>>
<bound method People.talk of <class '__main__.People'>>
View Code

也就是說,當對象在調用類的綁定方法時,也會默認把類看成參數傳遞進去!因此下面執行正常,並不會由於這個方法綁定到類身上,而對象調用沒有傳遞參數,報錯!blog

class People: @classmethod def talk(cls): pass p = People() People.talk() p.talk()
View Code

可是,若是 talk() 沒有參數,則下面代碼均會報錯md5

class People: @classmethod def talk(): pass p = People() People.talk() p.talk() #報錯結果
talk() takes 0 positional arguments but 1 was given
View Code

二者報錯結果一致,這就說明了,當對象來調用類的綁定方法時,也是自動將類傳遞進去,並不需遵循函數參數傳遞的規則。

綁定方法總結:類中方法默認都是綁定給對象使用,當對象調用綁定方法時,會自動將對象做爲第一個參數傳遞進去;而類來調用,則必須遵循函數參數一一對應的規則,有幾個參數,就必須傳遞幾個參數。若是一個方法是用了 classmethod 裝飾器,那麼這個方法綁定到類身上,無論是對象來調用仍是類調用,都會將類做爲第一個參數傳遞進去。

非綁定方法

上面說了,類中的方法要麼是綁定給對象使用,要麼是綁定給類使用,那麼有沒有不綁定給二者使用的函數?

  答案是,固然有,Python 給咱們提供了 staticmethod 裝飾器,能夠解除綁定關係,將一個類中的方法,變爲一個普通函數

import hashlib import time class MySQL: def __init__(self, host, port): self.id = self.create_id() self.host = host self.port = port @staticmethod def create_id():  # 就是一個普通工具
        m = hashlib.md5(str(time.clock()).encode('utf-8')) return m.hexdigest() print(MySQL.create_id) conn = MySQL('127.0.0.1', 3306) print(conn.create_id) # 運行結果
<function MySQL.create_id at 0x0000021BEAAE9B70>
<function MySQL.create_id at 0x0000021BEAAE9B70>
View Code

從上面的輸出結果能夠看出,使用了 staticmethod 裝飾了一個函數,那麼這個函數跟普通函數沒有什麼區別。既然是普通函數,那麼就聽從函數參數傳遞規則,有幾個參數就傳遞幾個參數。

相關文章
相關標籤/搜索