国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁(yè) > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

Python:self 詳解

0
分享至

在 Python 中,self 并不是語(yǔ)言關(guān)鍵字,而是實(shí)例方法中第一個(gè)參數(shù)的約定名稱(chēng),指向調(diào)用該方法的實(shí)例對(duì)象。它的顯式存在集中體現(xiàn)了 Python 的核心設(shè)計(jì)哲學(xué):顯式優(yōu)于隱式、一切皆對(duì)象,以及簡(jiǎn)潔一致的調(diào)用模型。

一、self 的本質(zhì)是什么

首先要知道的是,self 不是 Python 的關(guān)鍵字,也沒(méi)有任何特殊語(yǔ)法含義。它只是實(shí)例方法中第一個(gè)參數(shù)的慣用名稱(chēng),用于表示“當(dāng)前對(duì)象的實(shí)例引用”。

例如:

        print("Woof!")

當(dāng)我們執(zhí)行:

d.bark()

Python 實(shí)際上在內(nèi)部做了如下調(diào)用:

Dog.bark(d)

也就是說(shuō),self 就是調(diào)用該方法的對(duì)象實(shí)例 d。因此,bark() 方法能通過(guò) self 訪問(wèn)對(duì)象的屬性和其他方法。

二、為什么必須顯式寫(xiě)出 self

很多面向?qū)ο笳Z(yǔ)言(如 Java、C++)中有一個(gè)隱藏參數(shù) this,它在方法中自動(dòng)存在。Python 沒(méi)有這樣做,原因在于它的“一切皆對(duì)象”哲學(xué):方法本質(zhì)上就是函數(shù)對(duì)象,只是存放在類(lèi)的命名空間中。

Python 不希望讓“方法”成為一種特殊語(yǔ)法,而是通過(guò)普通函數(shù)與對(duì)象綁定的機(jī)制來(lái)實(shí)現(xiàn)方法調(diào)用。這種設(shè)計(jì)讓函數(shù)、類(lèi)、實(shí)例三者的關(guān)系更透明、更靈活。

Python 不會(huì)自動(dòng)注入“實(shí)例引用”,必須顯式聲明第一個(gè)參數(shù),社區(qū)約定俗成地命名為 self。

這使得方法調(diào)用規(guī)則簡(jiǎn)單且一致:任何函數(shù)若綁定到實(shí)例上,其第一個(gè)參數(shù)都會(huì)接收實(shí)例對(duì)象。

三、方法的綁定機(jī)制:self 如何被傳入

要理解 self,首先需要了解方法在 Python 中是如何被綁定的。

當(dāng)我們通過(guò) 實(shí)例.方法 的方式訪問(wèn)一個(gè)方法時(shí),Python 會(huì)執(zhí)行以下步驟:

1、在實(shí)例所屬的類(lèi)中查找該方法對(duì)應(yīng)的函數(shù)對(duì)象。

2、如果找到該函數(shù)對(duì)象 f,則觸發(fā)其 __get__() 方法(這是通過(guò)描述符機(jī)制實(shí)現(xiàn)的)。

3、__get__() 方法會(huì)返回一個(gè)綁定方法(bound method) 對(duì)象,該對(duì)象內(nèi)部保存了當(dāng)前實(shí)例的引用。

4、當(dāng)我們調(diào)用這個(gè)綁定方法時(shí),Python 會(huì)自動(dòng)將保存的實(shí)例作為第一個(gè)參數(shù)(即 self)傳入原函數(shù)。

示例說(shuō)明:

a.show(10)

上述調(diào)用實(shí)際上等價(jià)于:

A.show(a, 10)

也就是說(shuō):

通過(guò)實(shí)例訪問(wèn)方法時(shí),會(huì)得到一個(gè)已綁定實(shí)例的“綁定方法”,調(diào)用時(shí)自動(dòng)傳入 self。

通過(guò)類(lèi)訪問(wèn)方法時(shí),得到的仍是一個(gè)普通函數(shù),調(diào)用時(shí)需要顯式傳入實(shí)例作為 self。

四、三種方法綁定的比較

Python 中存在三種類(lèi)型的方法綁定方式:

方法類(lèi)型

裝飾器

第一個(gè)參數(shù)

隱式綁定對(duì)象

用途

實(shí)例方法

(無(wú))self

實(shí)例

訪問(wèn)或修改實(shí)例狀態(tài)

類(lèi)方法

@classmethodcls

類(lèi)對(duì)象

操作類(lèi)本身(如工廠方法)

靜態(tài)方法

@staticmethod(無(wú))

工具函數(shù),不依賴(lài)實(shí)例或類(lèi)

示例:

        print("靜態(tài)方法")

調(diào)用方式:

Example.static_method()    # 不傳入任何對(duì)象

五、self 在繼承與多態(tài)中的作用

self 永遠(yuǎn)指向?qū)嶋H調(diào)用該方法的對(duì)象。即使方法定義在父類(lèi)中,被子類(lèi)繼承后調(diào)用時(shí),self 仍然指向子類(lèi)實(shí)例。

示例:

Dog().speak()  # Animal speaking: Dog

Animal.speak() 方法內(nèi)部訪問(wèn)的 self,在運(yùn)行時(shí)綁定為 Cat 或 Dog 實(shí)例,這就是多態(tài)(polymorphism)的基礎(chǔ)。

六、super() 與 self 的協(xié)作

在繼承中使用 時(shí),Python 會(huì)根據(jù)方法解析順序(MRO)找到父類(lèi)的方法,但 self 不會(huì)變。

s.show()

輸出:

Sub after

注意:super().show() 雖然調(diào)用了父類(lèi)方法,但 self 仍然是 Sub 實(shí)例。

七、常見(jiàn)錯(cuò)誤與誤區(qū)

(1)方法定義中遺漏 self 參數(shù)

# TypeError: Bad.func() takes 0 positional arguments but 1 was given

異常原因:通過(guò)實(shí)例調(diào)用方法時(shí),Python 會(huì)自動(dòng)將實(shí)例本身作為第一個(gè)參數(shù)傳入,但該方法定義沒(méi)有預(yù)留接收該參數(shù)的位置。

(2)誤以為 self 是固定關(guān)鍵字

實(shí)際上,self 只是約定俗成的參數(shù)名,可以使用任意名稱(chēng)替代:

        print(this)

但這樣做違反了 Python 社區(qū)的編碼規(guī)范,會(huì)嚴(yán)重?fù)p害代碼的可讀性和一致性。按照 PEP 8 約定,始終使用 self 表示實(shí)例方法的第一個(gè)參數(shù),使用 cls 表示類(lèi)方法的第一個(gè)參數(shù)。

(3)混淆類(lèi)屬性與實(shí)例屬性

        self.count += 1  # 這里實(shí)際創(chuàng)建了一個(gè)新的實(shí)例屬性!

如需修改類(lèi)屬性,應(yīng)顯式引用類(lèi)名:

Counter.count += 1       # 正確修改類(lèi)屬性

八、self 的設(shè)計(jì)哲學(xué)

從語(yǔ)言設(shè)計(jì)的角度看,self 的設(shè)計(jì)體現(xiàn)了 Python 的幾項(xiàng)核心理念。

(1)顯式優(yōu)于隱式(Explicit is better than implicit)

self 作為方法的第一個(gè)參數(shù)明確寫(xiě)出,清晰地表明了實(shí)例的傳遞過(guò)程,避免了像其他語(yǔ)言中隱藏的 this 指針?biāo)鶐?lái)的隱式行為。

(2)一切皆對(duì)象

在 Python 中,方法本身也是對(duì)象。具體來(lái)說(shuō),是綁定到類(lèi)中的函數(shù)對(duì)象。方法的綁定過(guò)程通過(guò)描述符協(xié)議實(shí)現(xiàn),而非特殊的語(yǔ)法規(guī)則,這體現(xiàn)了 Python 對(duì)象模型的一致性。

(3)簡(jiǎn)潔一致的調(diào)用模型

無(wú)論是 obj.method() 還是 Class.method(obj),本質(zhì)上都是將實(shí)例作為第一個(gè)參數(shù)傳遞給函數(shù)。這種設(shè)計(jì)消除了方法調(diào)用與函數(shù)調(diào)用之間的概念差異,保持了語(yǔ)義的一致性。

小結(jié)

在 Python 中,self 是實(shí)例方法中第一個(gè)參數(shù)的約定名稱(chēng)。通過(guò) self,實(shí)例方法能夠訪問(wèn)和修改對(duì)象的狀態(tài),并天然支持繼承與多態(tài)特性。即使在通過(guò) super() 調(diào)用父類(lèi)方法時(shí),self 依然正確地指向最初發(fā)起調(diào)用的實(shí)際對(duì)象。

因此,深入理解 self 不僅有助于掌握方法綁定的底層機(jī)制,更是透徹理解 Python 面向?qū)ο缶幊淘O(shè)計(jì)思想的重要基石。


點(diǎn)贊有美意,贊賞是鼓勵(lì)

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶(hù)上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
迪馬爾科:國(guó)米換帥是對(duì)的,但那不意味著我們和小因沒(méi)成功過(guò)

迪馬爾科:國(guó)米換帥是對(duì)的,但那不意味著我們和小因沒(méi)成功過(guò)

懂球帝
2026-01-12 07:50:15
演員朱珠疑似塌房?照片流出,驚呆網(wǎng)友!

演員朱珠疑似塌房?照片流出,驚呆網(wǎng)友!

大眼妹妹
2025-12-15 10:39:19
馬斯克怒斥英國(guó)政府:“法西斯”

馬斯克怒斥英國(guó)政府:“法西斯”

財(cái)聯(lián)社
2026-01-11 18:46:06
破案了!許利民痛斥球員耍大牌,指的是誰(shuí)?許導(dǎo)忍不住點(diǎn)出姓名

破案了!許利民痛斥球員耍大牌,指的是誰(shuí)?許導(dǎo)忍不住點(diǎn)出姓名

南海浪花
2026-01-12 06:17:12
眾星告別《驕陽(yáng)似我》宋威龍發(fā)18宮照趙今麥感謝曦光,莊序發(fā)長(zhǎng)文

眾星告別《驕陽(yáng)似我》宋威龍發(fā)18宮照趙今麥感謝曦光,莊序發(fā)長(zhǎng)文

阿訊說(shuō)天下
2026-01-11 21:16:47
伊朗總檢察長(zhǎng)警告:任何參與抗議的人都可能面臨死刑

伊朗總檢察長(zhǎng)警告:任何參與抗議的人都可能面臨死刑

桂系007
2026-01-10 23:48:54
鄭爽廣電封禁通知曝光!日子久了都忘了她有多惡劣,違法還棄養(yǎng)

鄭爽廣電封禁通知曝光!日子久了都忘了她有多惡劣,違法還棄養(yǎng)

萌神木木
2026-01-11 16:41:19
為保護(hù)馬杜羅夫妻戰(zhàn)死的古巴桑切斯上校,被曝光家人都住在美國(guó)!

為保護(hù)馬杜羅夫妻戰(zhàn)死的古巴桑切斯上校,被曝光家人都住在美國(guó)!

阿龍聊軍事
2026-01-09 20:20:47
濟(jì)南戰(zhàn)役大捷,粟裕卻被手下大將當(dāng)眾“摔帽子”!饒漱石連忙開(kāi)會(huì)

濟(jì)南戰(zhàn)役大捷,粟裕卻被手下大將當(dāng)眾“摔帽子”!饒漱石連忙開(kāi)會(huì)

古書(shū)記史
2026-01-09 00:30:19
再摳門(mén),也不要在網(wǎng)上買(mǎi)這6樣?xùn)|西,會(huì)致癌,看完真會(huì)后怕的!

再摳門(mén),也不要在網(wǎng)上買(mǎi)這6樣?xùn)|西,會(huì)致癌,看完真會(huì)后怕的!

古事尋蹤記
2026-01-07 07:18:22
不得不說(shuō)!廣東隊(duì)外援奎因,不懂人情世故呀

不得不說(shuō)!廣東隊(duì)外援奎因,不懂人情世故呀

體育哲人
2026-01-11 17:53:23
原來(lái)她是王石大女兒,比后媽年齡還大,45歲單身不結(jié)婚父親愁白頭

原來(lái)她是王石大女兒,比后媽年齡還大,45歲單身不結(jié)婚父親愁白頭

銀河史記
2026-01-06 12:33:04
優(yōu)衣庫(kù)這件“菱格羽絨服”,黑灰倆色我直接all,in了!

優(yōu)衣庫(kù)這件“菱格羽絨服”,黑灰倆色我直接all,in了!

吳霶愛(ài)體育
2025-12-19 11:55:59
2026年養(yǎng)老金好消息!1956年到1961年出生的人,可能調(diào)整更多嗎?

2026年養(yǎng)老金好消息!1956年到1961年出生的人,可能調(diào)整更多嗎?

社會(huì)日日鮮
2026-01-11 11:09:44
城市街頭的時(shí)尚動(dòng)態(tài):瑜伽褲下的生命力與美感

城市街頭的時(shí)尚動(dòng)態(tài):瑜伽褲下的生命力與美感

一抹暖陽(yáng)
2026-01-04 21:40:28
大寒那天,上海可能要下暴雪了

脊梁in上海
2026-01-11 19:44:01

李詠遺孀哈文現(xiàn)狀:定居美國(guó)富人區(qū),7年了沒(méi)再婚,女婿條件不錯(cuò)

李詠遺孀哈文現(xiàn)狀:定居美國(guó)富人區(qū),7年了沒(méi)再婚,女婿條件不錯(cuò)

削桐作琴
2026-01-03 14:25:54
我只認(rèn)出了萬(wàn)梓良 ,你們呢 ?

我只認(rèn)出了萬(wàn)梓良 ,你們呢 ?

小椰的奶奶
2026-01-12 01:45:27
李在明:若民間無(wú)人機(jī)“入朝”屬實(shí),將是嚴(yán)重犯罪

李在明:若民間無(wú)人機(jī)“入朝”屬實(shí),將是嚴(yán)重犯罪

新京報(bào)
2026-01-11 07:40:22
決議生效!芬蘭正式“退群”

決議生效!芬蘭正式“退群”

環(huán)球時(shí)報(bào)國(guó)際
2026-01-10 22:57:42
2026-01-12 08:07:00
MediaTea
MediaTea
專(zhuān)業(yè)的數(shù)字媒體、新媒體技術(shù)
1701文章數(shù) 72關(guān)注度
往期回顧 全部

科技要聞

“我們與美國(guó)的差距也許還在拉大”

頭條要聞

李獻(xiàn)林學(xué)習(xí)教育期間違規(guī)吃喝:5人喝4瓶酒 1人酒后死亡

頭條要聞

李獻(xiàn)林學(xué)習(xí)教育期間違規(guī)吃喝:5人喝4瓶酒 1人酒后死亡

體育要聞

U23國(guó)足形勢(shì):末輪不負(fù)泰國(guó)即確保晉級(jí)

娛樂(lè)要聞

留幾手為閆學(xué)晶叫屈?稱(chēng)網(wǎng)友自卑敏感

財(cái)經(jīng)要聞

外賣(mài)平臺(tái)"燒錢(qián)搶存量市場(chǎng)"迎來(lái)終局?

汽車(chē)要聞

2026款宋Pro DM-i長(zhǎng)續(xù)航補(bǔ)貼后9.98萬(wàn)起

態(tài)度原創(chuàng)

游戲
本地
健康
公開(kāi)課
軍事航空

這款帥到掉渣的GBA神作《洛克人ZERO》,被模仿無(wú)數(shù)次仍是巔峰

本地新聞

云游內(nèi)蒙|“包”你再來(lái)?一座在硬核里釀出詩(shī)意的城

這些新療法,讓化療不再那么痛苦

公開(kāi)課

李玫瑾:為什么性格比能力更重要?

軍事要聞

俄大使:馬杜羅夫婦被控制時(shí)身邊沒(méi)人

無(wú)障礙瀏覽 進(jìn)入關(guān)懷版