Python-類的繫結方法與非繫結方法
阿新 • • 發佈:2018-11-02
類中定義的函式分成兩大類
一:繫結方法(繫結給誰,誰來呼叫就自動將它本身當作第一個引數傳入):
-
繫結到類的方法:用classmethod裝飾器裝飾的方法。
為類量身定製 類.boud_method(),自動將類當作第一個引數傳入 (其實物件也可呼叫,但仍將類當作第一個引數傳入)
-
繫結到物件的方法:沒有被任何裝飾器裝飾的方法。
為物件量身定製 物件.boud_method(),自動將物件當作第一個引數傳入 (屬於類的函式,類可以呼叫,但是必須按照函式的規則來,沒有自動傳值那麼一說)
二:非繫結方法:用staticmethod裝飾器裝飾的方法
- 不與類或物件繫結,類和物件都可以呼叫,但是沒有自動傳值那麼一說。就是一個普通工具而已
注意:與繫結到物件方法區分開,在類中直接定義的函式,沒有被任何裝飾器裝飾的,都是繫結到物件的方法,可不是普通函式,物件呼叫該方法會自動傳值,而staticmethod裝飾的方法,不管誰來呼叫,都沒有自動傳值
繫結方法
classmehtod是給類用的,即繫結到類,類在使用時會將類本身當做引數傳給類方法的第一個引數(即便是物件來呼叫也會將類當作第一個引數傳入),python為我們內建了函式classmethod來把類中的函式定義成類方法
#settings.pyView CodeHOST='127.0.0.1' PORT=3306
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'>>View Codeconn=MySQL.from_conf() conn.from_conf() #物件也可以呼叫,但是預設傳的第一個引數仍然是類
非繫結方法
在類內部用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__的執行,列印就不告訴你: