一 綁定方法與非綁定方法
類中定義的函數分為兩大類:綁定方法和非綁定方法
其中綁定方法又分為綁定到對象的對象方法和綁定到類的類方法。
在類中正常定義的函數默認是綁定到對象的,而為某個函數加上裝飾器@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>
總結綁定方法與非綁定方法的使用:若類中需要一個功能,該功能的實現代碼中需要引用對象則將其定義成對象方法、需要引用類則將其定義成類方法、無需引用類或對象則將其定義成靜態方法。