【目錄】 一、綁定方法與非綁定方法 二、非綁定方法 一、綁定方法與非綁定方法 類中定義的函數分為兩大類:綁定方法和非綁定方法 其中綁定方法又分為綁定到對象的對象方法和綁定到類的類方法。 在類中正常定義的函數預設是綁定到對象的,而為某個函數加上裝飾器@classmethod後,該函數就綁定 ...
【目錄】
一、綁定方法與非綁定方法
二、非綁定方法
一、綁定方法與非綁定方法
類中定義的函數分為兩大類:綁定方法和非綁定方法
其中綁定方法又分為綁定到對象的對象方法和綁定到類的類方法。
在類中正常定義的函數預設是綁定到對象的,而為某個函數加上裝飾器@classmethod後,該函數就綁定到類了。
類方法通常用來在__init__的基礎上提供額外的初始化實例的方式:
# 配置文件settings.py的內容 HOST='127.0.0.1' PORT=3306 # 類方法的應用 import settings class MySQL: def __init__(self,host,port): self.host=host self.port=port @classmethod def from_conf(cls): # 從配置文件中讀取配置進行初始化 return cls(settings.HOST,settings.PORT) >>> MySQL.from_conf # 綁定到類的方法 <bound method MySQL.from_conf of <class ‘__main__.MySQL'>> >>> conn=MySQL.from_conf() # 調用類方法,自動將類MySQL當作第一個參數傳給cls
綁定到類的方法就是專門給類用的,但其實對象也可以調用,只不過自動傳入的第一個參數仍然是類,
也就是說這種調用是沒有意義的,並且容易引起混淆,這也是python的對象系統與其他面向對象語言對象系統的區別之一,
比如smalltalk和ruby中,綁定到類的方法與綁定到對象的方法是嚴格區分開的。
二、非綁定方法
為類中某個函數加上裝飾器@staticmethod後,該函數就變成了非綁定方法,也稱為靜態方法。
該方法不與類或對象綁定,類與對象都可以來調用它,但它就是一個普通函數而已,因而沒有自動傳值那麼一說。
import uuid class MySQL: def __init__(self,host,port): self.id=self.create_id() self.host=host self.port=port @staticmethod def create_id(): return uuid.uuid1() >>> conn=MySQL(‘127.0.0.1',3306) >>> print(conn.id) #100365f6-8ae0-11e7-a51e-0088653ea1ec # 類或對象來調用create_id發現都是普通函數,而非綁定到誰的方法 >>> MySQL.create_id <function MySQL.create_id at 0x1025c16a8> >>> conn.create_id <function MySQL.create_id at 0x1025c16a8>
三、總結綁定方法與非綁定方法的使用
若類中需要一個功能,
該功能的實現代碼中需要引用對象則將其定義成對象方法、
需要引用類則將其定義成類方法、
無需引用類或對象則將其定義成靜態方法。