您好,登錄后才能下訂單哦!
類中定義的方法大致可以分為兩類:綁定方法和非綁定方法。其中綁定方法又可以分為綁定到對象的方法和綁定到類的方法~
在類中沒有被任何裝飾器修飾的方法就是 綁定到對象的方法,這類方法專門為對象定制。
class Person:
country = "China"
def __init__(self, name, age):
self.name = name
self.age = age
def speak(self):
print(self.name + ', ' + str(self.age))
p = Person('Kitty', 18)
print(p.__dict__) # {'name': 'Kitty', 'age': 18}
print(Person.__dict__['speak']) # <function Person.speak at 0x10b81cbf8>
speak即為綁定到對象的方法,這個方法不在對象的名稱空間中,而是在類的名稱空間中。
通過對象調用綁定到對象的方法,會有一個自動傳值的過程,即自動將 當前對象傳遞給方法的第一個參數(self,一般都叫self,也可以寫成別的名稱),若是使用類調用,則第一個參數需要手動傳值~
p = Person('Kitty', 18)
p.speak() # 通過對象調用
Person.speak(p) # 通過類調用
類中使用@classmethod修飾的方法就是 綁定到類的方法。這類方法專門為類定制。通過類名調用 綁定到類的方法 時,會將 類本身當做參數傳給類方法的第一個參數~
class Operate_database():
host = '192.168.0.5'
port = '3306'
user = 'abc'
password = '123456'
@classmethod
def connect(cls): # 約定俗成第一個參數名為cls,也可以定義為其他參數名
print(cls)
print(cls.host + ':' + cls.port + ' ' + cls.user + '/' + cls.password)
Operate_database.connect()
# 輸出結果:
<class '__main__.Operate_database'>
192.168.0.5:3306 abc/123456
通過對象也可以調用,只是默認傳遞的第一個參數還是這個對象對應的類~
Operate_database().connect() # 輸出結果一致
在類內部使用 @staticmethod 修飾的方法即為 非綁定方法,這類方法和普通定義的函數沒有區別,不與類或對象綁定,誰都可以調用,且沒有自動傳值的效果~
import hashlib
class Operate_database():
def __init__(self, host, port, user, password):
self.host = host
self.port = port
self.user = user
self.password = password
@staticmethod
def 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') # f7a1cc409ed6f51058c2b4a94a7e1956
# p = Operate_database('192.168.0.5', '3306', 'abc', '123456')
# p.get_passwrod(p.user, p.password) # 也可以通過對象調用
簡而言之,非綁定方法就是將普通方法放到了類的內部~
.................^_^
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。