最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中self用法示例詳解

 更新時(shí)間:2026年01月27日 12:01:03   作者:MediaTea  
在Python中,類方法定義中的self是一個(gè)??約定俗成的參數(shù)名??,代表??類的實(shí)例對(duì)象本身??,下面這篇文章主要介紹了Python中self用法示例詳解的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在 Python 中,self 并不是語(yǔ)言關(guān)鍵字,而是實(shí)例方法中第一個(gè)參數(shù)的約定名稱,指向調(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ù)的慣用名稱,用于表示“當(dāng)前對(duì)象的實(shí)例引用”。

例如:

class Dog:    def bark(self):        print("Woof!")

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

d = Dog()d.bark()

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

Dog.bark(d)

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

二、為什么必須顯式寫出 self

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

Python 不希望讓“方法”成為一種特殊語(yǔ)法,而是通過(guò)普通函數(shù)與對(duì)象綁定的機(jī)制來(lái)實(shí)現(xiàn)方法調(diào)用。這種設(shè)計(jì)讓函數(shù)、類、實(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í)例所屬的類中查找該方法對(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ō)明:

class A:    def show(self, x):        print(self, x)
a = A()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ò)類訪問(wèn)方法時(shí),得到的仍是一個(gè)普通函數(shù),調(diào)用時(shí)需要顯式傳入實(shí)例作為 self。

四、三種方法綁定的比較

Python 中存在三種類型的方法綁定方式:

方法類型

裝飾器

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

隱式綁定對(duì)象

用途

實(shí)例方法

(無(wú))self

實(shí)例

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

類方法

@classmethodcls

類對(duì)象

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

靜態(tài)方法

@staticmethod(無(wú))

無(wú)

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

示例:

class Example:    def instance_method(self):        print("實(shí)例方法", self)
    @classmethod    def class_method(cls):        print("類方法", cls)
    @staticmethod    def static_method():        print("靜態(tài)方法")

調(diào)用方式:

obj = Example()obj.instance_method()      # 自動(dòng)傳入實(shí)例Example.class_method()     # 自動(dòng)傳入類Example.static_method()    # 不傳入任何對(duì)象

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

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

示例:

class Animal:    def speak(self):        print("Animal speaking:", type(self).__name__)
class Cat(Animal):    pass
class Dog(Animal):    pass
Cat().speak()  # Animal speaking: CatDog().speak()  # Animal speaking: Dog

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

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

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

class Base:    def show(self):        print("Base:", self)
class Sub(Base):    def show(self):        print("Sub before")        super().show()   # 調(diào)用 Base.show(self)        print("Sub after")
s = Sub()s.show()

輸出:

Sub beforeBase: <__main__.Sub object ...>Sub after

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

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

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

class Bad:    def func():        print("missing self")
Bad().func()  # 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ù)名,可以使用任意名稱替代:

class A:    def f(this):        print(this)

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

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

class Counter:    count = 0            # 這是類屬性,所有實(shí)例共享
    def __init__(self):        self.count += 1  # 這里實(shí)際創(chuàng)建了一個(gè)新的實(shí)例屬性!

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

Counter.count += 1       # 正確修改類屬性

八、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ù)明確寫出,清晰地表明了實(shí)例的傳遞過(guò)程,避免了像其他語(yǔ)言中隱藏的 this 指針?biāo)鶐?lái)的隱式行為。

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

在 Python 中,方法本身也是對(duì)象。具體來(lái)說(shuō),是綁定到類中的函數(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ù)的約定名稱。通過(guò) self,實(shí)例方法能夠訪問(wèn)和修改對(duì)象的狀態(tài),并天然支持繼承與多態(tài)特性。即使在通過(guò) super() 調(diào)用父類方法時(shí),self 依然正確地指向最初發(fā)起調(diào)用的實(shí)際對(duì)象。

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

到此這篇關(guān)于Python中self用法示例詳解的文章就介紹到這了,更多相關(guān)Python self用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python中實(shí)現(xiàn)精確的浮點(diǎn)數(shù)運(yùn)算詳解

    python中實(shí)現(xiàn)精確的浮點(diǎn)數(shù)運(yùn)算詳解

    計(jì)算機(jī)智能處理可數(shù)集合的運(yùn)算,但是全體實(shí)數(shù)是不可數(shù)的,所以計(jì)算機(jī)只能用一些奇怪的方法來(lái)擬合他,于是就產(chǎn)生了浮點(diǎn)數(shù)。下面這篇文章主要給大家介紹了關(guān)于python中實(shí)現(xiàn)精確浮點(diǎn)數(shù)運(yùn)算的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Python讀取預(yù)處理DICOM文件方式詳解

    Python讀取預(yù)處理DICOM文件方式詳解

    這篇文章主要介紹了Python讀取預(yù)處理DICOM文件方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Python字節(jié)碼與程序執(zhí)行過(guò)程詳解

    Python字節(jié)碼與程序執(zhí)行過(guò)程詳解

    這篇文章主要為大家介紹了Python字節(jié)碼與程序執(zhí)行過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 淺談tensorflow與pytorch的相互轉(zhuǎn)換

    淺談tensorflow與pytorch的相互轉(zhuǎn)換

    本文主要介紹了簡(jiǎn)單介紹一下tensorflow與pytorch的相互轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • window環(huán)境pip切換國(guó)內(nèi)源(pip安裝異常緩慢的問(wèn)題)

    window環(huán)境pip切換國(guó)內(nèi)源(pip安裝異常緩慢的問(wèn)題)

    這篇文章主要介紹了window環(huán)境pip切換國(guó)內(nèi)源(pip安裝異常緩慢的問(wèn)題),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 使用Python在Word中插入圖片并文字環(huán)繞的方法

    使用Python在Word中插入圖片并文字環(huán)繞的方法

    在Word文檔中插入圖片能夠提供更直觀的信息,插入圖片時(shí),我們還可以調(diào)整圖片大小,以及設(shè)置合適的文字環(huán)繞方式,本文將提供兩種使用Python在Word文檔中插入圖片并設(shè)置文字環(huán)繞的方法,需要的朋友可以參考下
    2024-06-06
  • python中strip(),lstrip(),rstrip()函數(shù)的使用講解

    python中strip(),lstrip(),rstrip()函數(shù)的使用講解

    這篇文章主要介紹了python中strip(),lstrip(),rstrip()函數(shù)的使用講解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Python后端API開(kāi)發(fā)的完全指南

    Python后端API開(kāi)發(fā)的完全指南

    在現(xiàn)代Web開(kāi)發(fā)中,API(Application Programming Interface)已成為不同應(yīng)用程序之間通信的核心方式,本文將全面介紹使用Python進(jìn)行后端API開(kāi)發(fā)的全過(guò)程,需要的朋友可以參考下
    2025-09-09
  • SublimeText 2編譯python出錯(cuò)的解決方法(The system cannot find the file specified)

    SublimeText 2編譯python出錯(cuò)的解決方法(The system cannot find the file

    這篇文章主要介紹了SublimeText 2編譯python報(bào)The system cannot find the file specified錯(cuò)誤的解決方法,大家參考使用吧
    2013-11-11
  • 使用python-pptx包批量修改ppt格式的實(shí)現(xiàn)

    使用python-pptx包批量修改ppt格式的實(shí)現(xiàn)

    今天小編就為大家分享一篇使用python-pptx包批量修改ppt格式的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02

最新評(píng)論

凌云县| 南投县| 湖南省| 东港市| 华坪县| 佛坪县| 富平县| 日照市| 来凤县| 郸城县| 农安县| 稷山县| 革吉县| 临城县| 商丘市| 峨眉山市| 山阳县| 黑水县| 白城市| 香格里拉县| 淮滨县| 泸溪县| 绥芬河市| 东乌| 阿城市| 海丰县| 阿图什市| 宁安市| 清水河县| 开平市| 松滋市| 海南省| 永平县| 黑山县| 读书| 石景山区| 镇平县| 南城县| 桐柏县| 工布江达县| 探索|