1. 程式人生 > >Python-類的繫結方法與非繫結方法

Python-類的繫結方法與非繫結方法

類中定義的函式分成兩大類

一:繫結方法(繫結給誰,誰來呼叫就自動將它本身當作第一個引數傳入):

  1. 繫結到類的方法:用classmethod裝飾器裝飾的方法。

         為類量身定製
    
         類.boud_method(),自動將類當作第一個引數傳入
    
       (其實物件也可呼叫,但仍將類當作第一個引數傳入)
    
  2. 繫結到物件的方法:沒有被任何裝飾器裝飾的方法。

        為物件量身定製
    
        物件.boud_method(),自動將物件當作第一個引數傳入
    
      (屬於類的函式,類可以呼叫,但是必須按照函式的規則來,沒有自動傳值那麼一說)
    

二:非繫結方法:用staticmethod裝飾器裝飾的方法

  1. 不與類或物件繫結,類和物件都可以呼叫,但是沒有自動傳值那麼一說。就是一個普通工具而已

注意:與繫結到物件方法區分開,在類中直接定義的函式,沒有被任何裝飾器裝飾的,都是繫結到物件的方法,可不是普通函式,物件呼叫該方法會自動傳值,而staticmethod裝飾的方法,不管誰來呼叫,都沒有自動傳值

  

繫結方法

classmehtod是給類用的,即繫結到類,類在使用時會將類本身當做引數傳給類方法的第一個引數(即便是物件來呼叫也會將類當作第一個引數傳入),python為我們內建了函式classmethod來把類中的函式定義成類方法

  

#settings.py
HOST='127.0.0.1' PORT=3306
View Code

 

class MySQL:
    def __init__(self,host,port):
        self.host=host
        self.port=port

    @classmethod
    def from_conf(cls):
        print(cls)
        return cls(settings.HOST,settings.PORT)

print(MySQL.from_conf) #<bound method MySQL.from_conf of <class '__main__.MySQL'>>
conn=MySQL.from_conf() conn.from_conf() #物件也可以呼叫,但是預設傳的第一個引數仍然是類
View Code

非繫結方法

在類內部用staticmethod裝飾的函式即非繫結方法,就是普通函式

statimethod不與類或物件繫結,誰都可以呼叫,沒有自動傳值效果

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.time()).encode('utf-8'))
        return m.hexdigest()


print(MySQL.create_id) #<function MySQL.create_id at 0x0000000001E6B9D8> #檢視結果為普通函式
View Code

classmethod與staticmethod的對比

 

import settings
class MySQL:
    def __init__(self,host,port):
        self.host=host
        self.port=port

    @staticmethod
    def from_conf():
        return MySQL(settings.HOST,settings.PORT)

    # @classmethod #哪個類來呼叫,就將哪個類當做第一個引數傳入
    # def from_conf(cls):
    #     return cls(settings.HOST,settings.PORT)

    def __str__(self):
        return '就不告訴你'

class Mariadb(MySQL):
    def __str__(self):
        return '<%s:%s>' %(self.host,self.port)


m=Mariadb.from_conf()
print(m) #我們的意圖是想觸發Mariadb.__str__,但是結果觸發了MySQL.__str__的執行,列印就不告訴你: