python:绑定方法和非绑定方法
類中定義的方法大致可以分為兩類:綁定方法和非綁定方法。其中綁定方法又可以分為綁定到對象的方法和綁定到類的方法。
一、綁定方法
1.1 對象的綁定方法
在類中沒有被任何裝飾器修飾的方法就是 綁定到對象的方法,這類方法專門為對象定制。
speak即為綁定到對象的方法,這個方法不在對象的名稱空間中,而是在類的名稱空間中。
通過對象調用綁定到對象的方法,會有一個自動傳值的過程,即自動將當前對象傳遞給方法的第一個參數(self,一般都叫self,也可以寫成別的名稱);若是使用類調用,則第一個參數需要手動傳值。
# p = Person('Kitty', 18) # p.speak() 通過對象調用 # Kitty, 18 # Person.speak(p) 通過類調用 # Kitty, 181.2 類的綁定方法
類中使用 @classmethod 修飾的方法就是綁定到類的方法。這類方法專門為類定制。通過類名調用綁定到類的方法時,會將類本身當做參數傳給類方法的第一個參數。
通過對象也可以調用,只是默認傳遞的第一個參數還是這個對象對應的類。
Operate_database().connect() # 輸出結果一致 #<class '__main__.Operate_database'> #192.168.0.5:3306 abc/123456二、非綁定方法
在類內部使用 @staticmethod 修飾的方法即為非綁定方法,這類方法和普通定義的函數沒有區別,不與類或對象綁定,誰都可以調用,且沒有自動傳值的效果。
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' import hashlibclass Operate_database():def __init__(self, host, port, user, password):self.host = hostself.port = portself.user = userself.password = password@staticmethoddef get_passwrod(salt, password):m = hashlib.md5(salt.encode('utf-8')) # 加鹽處理m.update(password.encode('utf-8'))return m.hexdigest()hash_password = Operate_database.get_passwrod('lala', '123456') # 通過類來調用 print(hash_password) #f7a1cc409ed6f51058c2b4a94a7e1956 p = Operate_database('192.168.0.5', '3306', 'abc', '123456') hash_password = p.get_passwrod(p.user, p.password) # 也可以通過對象調用 print(hash_password) #0659c7992e268962384eb17fafe88364簡而言之,非綁定方法就是將普通方法放到了類的內部。
三、練習
假設我們現在有一個需求,需要讓Mysql實例化出的對象可以從文件settings.py中讀取數據
# settings.py IP = '1.1.1.10' PORT = 3306 NET = 27 # test.py import uuidclass Mysql:def __init__(self, ip, port, net):self.uid = self.create_uid()self.ip = ipself.port = portself.net = netdef tell_info(self):"""查看ip地址和端口號"""print('%s:%s' % (self.ip, self.port))@classmethoddef from_conf(cls):return cls(IP, NET, PORT)@staticmethoddef func(x, y):print('不與任何人綁定')@staticmethoddef create_uid():"""隨機生成一個字符串"""return uuid.uuid1()# 默認的實例化方式:類名() obj = Mysql('10.10.0.9', 3307, 27) obj.tell_info() #10.10.0.9:3307四、總結
4.1 綁定方法小結
如果函數體代碼需要用外部傳入的類,則應該將該函數定義成綁定給類的方法
如果函數體代碼需要用外部傳入的對象,則應該將該函數定義成綁定給對象的方法
4.2 非綁定方法小結
如果函數體代碼既不需要外部傳入的類也不需要外部傳入的對象,則應該將該函數定義成非綁定方法/普通函數
總結
以上是生活随笔為你收集整理的python:绑定方法和非绑定方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python从字符串中提取数字_filt
- 下一篇: Python的Mixins机制