09-05 綁定方法與非綁定方法


一 綁定方法與非綁定方法

​ 類中定義的函數分為兩大類:綁定方法和非綁定方法

​ 其中綁定方法又分為綁定到對象的對象方法和綁定到類的類方法。

​ 在類中正常定義的函數默認是綁定到對象的,而為某個函數加上裝飾器@classmethod后,該函數就綁定到了類。

惡搞圖40

​ 我們在之前的章節中已經介紹過對象方法了,本節我們主要介紹類方法。類方法通常用來在__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中,綁定到類的方法與綁定到對象的方法是嚴格區分開的。

惡搞圖41

二 非綁定方法

為類中某個函數加上裝飾器@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>

總結綁定方法與非綁定方法的使用:若類中需要一個功能,該功能的實現代碼中需要引用對象則將其定義成對象方法、需要引用類則將其定義成類方法、無需引用類或對象則將其定義成靜態方法。

惡搞圖42


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM