新聞中心
對于在類體中定義的實(shí)例方法,Python 會自動綁定方法的第一個參數(shù)(通常建議將該參數(shù)命名為 self),第一個參數(shù)總是指向調(diào)用該方法的對象。根據(jù)第一個參數(shù)出現(xiàn)位置的不同,第一個參數(shù)所綁定的對象略有區(qū)別:

創(chuàng)新互聯(lián)公司主要從事做網(wǎng)站、網(wǎng)站制作、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)馬山,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108
在構(gòu)造方法中引用該構(gòu)造方法正在初始化的對象。
在普通實(shí)例方法中引用調(diào)用該方法的對象。
由于實(shí)例方法(包括構(gòu)造方法)的第一個 self 參數(shù)會自動綁定,因此程序在調(diào)用普通實(shí)例方法、構(gòu)造方法時不需要為第一個參數(shù)傳值。
self 參數(shù)(自動綁定的第一個參數(shù))作用就是引用當(dāng)前方法的調(diào)用者,比如前面介紹的在構(gòu)造方法中通過 self 為該對象增加實(shí)例變量。也可以在一個實(shí)例方法中訪問該類的另一個實(shí)例方法或變量。假設(shè)定義了一個 Dog 類,這個 Dog 對象的 run() 方法需要調(diào)用它的 jump() 方法,此時就可通過 self 參數(shù)作為 jump() 方法的調(diào)用者。
方法的第一個參數(shù)所代表的對象是不確定的,但它的類型是確定的,即它所代表的只能是當(dāng)前類的實(shí)例;只有當(dāng)這個方法被調(diào)用時,它所代表的對象才被確定下來誰在調(diào)用這個方法,方法的第一個參數(shù)就代表誰。
例如定義如下 Dog 類:
class Dog:
# 定義一個jump()方法
def jump(self):
print("正在執(zhí)行jump方法")
# 定義一個run()方法,run()方法需要借助jump()方法
def run(self):
# 使用self參數(shù)引用調(diào)用run()方法的對象
self.jump()
print("正在執(zhí)行run方法")上面代碼的 run() 方法中的 self 代表該方法的調(diào)用者:誰在調(diào)用 run() 方法,那么 self 就代表誰。因此該方法表示:當(dāng)一個 Dog 對象調(diào)用 run() 方法時,run() 方法需要依賴它自己的 jump() 方法。
當(dāng) Python 對象的一個方法調(diào)用另一個方法時,不可以省略 self。也就是說,將上面的 run()方法改為如下形式是不正確的:
# 定義一個run()方法,run()方法需要借助jump()方法
def run():
#省略self,下面代碼會報錯
self.jump()
print("正在執(zhí)行run方法")此外,在構(gòu)造方法中,self 參數(shù)(第一個參數(shù))代表該構(gòu)造方法正在初始化的對象。例如如下代碼:
class InConstructor : def __init__(self) : # 在構(gòu)造方法里定義一個foo變量(局部變量) foo = 0 # 使用self代表該構(gòu)造方法正在初始化的對象 # 下面的代碼將會把該構(gòu)造方法正在初始化的對象的foo實(shí)例變量設(shè)為6 self.foo = 6 # 所有使用InConstructor創(chuàng)建的對象的foo實(shí)例變量將被設(shè)為6 print(InConstructor().foo) # 輸出6
在 InConstructor 的構(gòu)造方法中,self 參數(shù)總是引用該構(gòu)造方法正在初始化的對象。程序中將正在執(zhí)行初始化的 InConstructor 對象的 foo 實(shí)例變量設(shè)為 6,這意味著該構(gòu)造方法返回的所有對象的 foo 實(shí)例變量都等于 6。
需要說明的是,自動綁定的 self 參數(shù)并不依賴具體的調(diào)用方式,不管是以方法調(diào)用還是以函數(shù)調(diào)用的方式執(zhí)行它,self 參數(shù)一樣可以自動綁定。例如如下程序:
class User:
def test(self):
print('self參數(shù): ', self)
u = User()
# 以方法形式調(diào)用test()方法
u.test() # <__main__.User object at 0x00000000021F8240>
# 將User對象的test方法賦值給foo變量
foo = u.test
# 通過foo變量(函數(shù)形式)調(diào)用test()方法。
foo() # <__main__.User object at 0x00000000021F8240>上面程序中第 5 行代碼以方法形式調(diào)用 User 對象的 test() 方法,此時方法調(diào)用者當(dāng)然會自動綁定到方法的第一個參數(shù)(self 參數(shù));程序中第 11 行代碼以函數(shù)形式調(diào)用 User 對象的 test() 方法,看上去此時沒有調(diào)用者了,但程序依然會把實(shí)際調(diào)用者綁定到方法的第一個參數(shù),因此輸出結(jié)果完全相同。
當(dāng) self 參數(shù)作為對象的默認(rèn)引用時,程序可以像訪問普通變量一樣來訪問這個 self 參數(shù),甚至可以把 self 參數(shù)當(dāng)成實(shí)例方法的返回值。看下面程序:
class ReturnSelf :
def grow(self):
if hasattr(self, 'age'):
self.age += 1
else:
self.age = 1
# return self返回調(diào)用該方法的對象
return self
rs = ReturnSelf()
# 可以連續(xù)調(diào)用同一個方法
rs.grow().grow().grow()
print("rs的age屬性值是:", rs.age)從上面程序中可以看出,如果在某個方法中把 self 參數(shù)作為返回值,則可以多次連續(xù)調(diào)用同一個方法,從而使得代碼更加簡潔。但是這種把 self 參數(shù)作為返回值的方法可能會造成實(shí)際意義的模糊,例如上面的 grow 方法用于表示對象的生長,即 age 屬性的值加 1,實(shí)際上不應(yīng)該有返回值。
當(dāng)前名稱:創(chuàng)新互聯(lián)Python教程:pythonself用法詳解
文章URL:http://www.dlmjj.cn/article/dpoeodp.html


咨詢
建站咨詢
