類中定義的方法大致可以分為兩類:繫結方法和非繫結方法。其中繫結方法又可以分為繫結到物件的方法和繫結到類的方法。
一、繫結方法
1.1 物件的繫結方法
在類中沒有被任何裝飾器修飾的方法就是 繫結到物件的方法,這類方法專門為物件定製。
class
person
: country =
"china"
def__init__
(self, name, age)
: self.name = name
self.age = age
defspeak
(self)
:print
(self.name +
', '
+str
(self.age))
p = person(
'kitty',18
)print
(p.__dict__)
#
#print(person.__dict__['speak'])
#
speak即為繫結到物件的方法,這個方法不在物件的命名空間中,而是在類的命名空間中。
通過物件呼叫繫結到物件的方法,會有乙個自動傳值的過程,即自動將當前物件傳遞給方法的第乙個引數(self,一般都叫self,也可以寫成別的名稱);若是使用類呼叫,則第乙個引數需要手動傳值。
# p = person('kitty', 18)
# p.speak() 通過物件呼叫
# kitty, 18
# person.speak(p) 通過類呼叫
# kitty, 18
1.2 類的繫結方法
類中使用 @classmethod 修飾的方法就是繫結到類的方法。這類方法專門為類定製。通過類名呼叫繫結到類的方法時,會將類本身當做引數傳給類方法的第乙個引數。
'''
'''class
operate_database()
: host =
'192.168.0.5'
port =
'3306'
user =
'abc'
password =
'123456'
@classmethod
defconnect
(cls)
:# 約定俗成第乙個引數名為cls,也可以定義為其他引數名
print
(cls)
print
(cls.host +
':'+ cls.port +
' '+ cls.user +
'/'+ cls.password)
operate_database.connect()#
#192.168.0.5:3306 abc/123456
通過物件也可以呼叫,只是預設傳遞的第乙個引數還是這個物件對應的類。
operate_database(
).connect(
)# 輸出結果一致
##192.168.0.5:3306 abc/123456
二、非繫結方法
在類內部使用 @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
defget_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 uuid
class
mysql
:def
__init__
(self, ip, port, net)
: self.uid = self.create_uid(
) self.ip = ip
self.port = port
self.net = net
deftell_info
(self)
:"""檢視ip位址和埠號"""
print
('%s:%s'
%(self.ip, self.port))
@classmethod
deffrom_conf
(cls)
:return cls(ip, net, port)
@staticmethod
deffunc
(x, y)
:print
('不與任何人繫結')
@staticmethod
defcreate_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 類的繫結方法和非繫結方法
首先我們明確乙個知識點,凡是類中的方法或函式,預設情況下都是繫結給物件使用的。下面,我們通過例項,來慢慢解析繫結方法的應用。class people def init self,name,age self.name name self.age age def talk self pass p peo...
Python教程 繫結方法與非繫結方法
一 繫結方法 1.物件的繫結方法 首先我們明確乙個知識點,凡是類中的方法或函式,預設情況下都是繫結給物件使用的。下面,我們通過例項,來慢慢解析繫結方法的應用。class people def init self,name,age self.name name self.age age deftalk...
繫結方法與非繫結方法
特性 繫結給誰就應該由誰來呼叫,誰來呼叫就會將誰當作第乙個引數自動傳入 精髓在於自動傳值 繫結方法分為兩類 1.1 繫結給物件方法 在類內部定義的函式 沒有被任何裝飾器修飾的 預設就是繫結給物件用的 1.2 繫結給類的方法 在類內部定義的函式如果被裝飾器 classmethod裝飾,那麼則是繫結給類...