python 繫結方法和非繫結方法

2021-10-23 13:56:05 字數 3936 閱讀 7595

類中定義的方法大致可以分為兩類:繫結方法和非繫結方法。其中繫結方法又可以分為繫結到物件的方法和繫結到類的方法。

一、繫結方法

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裝飾,那麼則是繫結給類...