深入理解python中實(shí)例方法的第一個(gè)參數(shù)self
在Python的面向?qū)ο缶幊讨校?code>self 是一個(gè)經(jīng)常遇到的術(shù)語(yǔ),但對(duì)于初學(xué)者來(lái)說(shuō),它可能會(huì)引起困惑。為什么我們需要它?它是如何工作的?在本篇文章中,我們將深入探討 self
的工作原理以及它在Python編程中的重要性。
1. 什么是self
在Python中,self
是類(lèi)的實(shí)例方法的一個(gè)參數(shù),代表類(lèi)的實(shí)例對(duì)象本身。實(shí)際上,當(dāng)我們調(diào)用一個(gè)實(shí)例的方法時(shí),Python會(huì)自動(dòng)傳遞這個(gè)實(shí)例作為第一個(gè)參數(shù),這就是 self
。
class Car: def __init__(self, brand, model): self.brand = brand self.model = model def display(self): print(f"This car is a {self.brand} {self.model}.")
在上面的例子中,display
方法使用 self
來(lái)訪問(wèn) brand
和 model
屬性。
2. 為什么需要self
a. 訪問(wèn)實(shí)例屬性和方法
self
提供了一種方式,使得對(duì)象的方法可以訪問(wèn)和操作對(duì)象的屬性。在上述的 Car
類(lèi)中,我們使用 self.brand
和 self.model
來(lái)訪問(wèn)實(shí)例的屬性。
b. 方法鏈
self
允許對(duì)象的方法返回其自身的引用,這使得我們可以鏈接方法調(diào)用。
class Calculator: def __init__(self, value=0): self.value = value def add(self, other_value): self.value += other_value return self def subtract(self, other_value): self.value -= other_value return self calc = Calculator() calc.add(5).subtract(3) print(calc.value) # Outputs: 2
3. self 不是關(guān)鍵字
雖然 self
是一個(gè)約定俗成的命名,但它不是Python的關(guān)鍵字。您可以使用任何其他名稱(chēng),但為了代碼清晰和遵循社區(qū)習(xí)慣,建議使用 self
。
4. 靜態(tài)方法和類(lèi)方法
不是所有的類(lèi)方法都需要 self
作為它的第一個(gè)參數(shù)。靜態(tài)方法和類(lèi)方法是兩種例外。
靜態(tài)方法:使用 @staticmethod
裝飾器定義,它們不接收任何特殊的第一個(gè)參數(shù)。
class MyClass: @staticmethod def my_static_method(arg1, arg2): pass
類(lèi)方法:使用 @classmethod
裝飾器定義,它們接收類(lèi)作為第一個(gè)參數(shù),通常命名為 cls
。
class MyClass: @classmethod def my_class_method(cls, arg1, arg2): pass
靜態(tài)方法和類(lèi)方法都是與類(lèi)而非其實(shí)例關(guān)聯(lián)的方法。盡管它們?cè)谀撤N程度上相似,但它們有幾個(gè)主要的區(qū)別。以下是靜態(tài)方法和類(lèi)方法之間的主要區(qū)別:
1.定義:
- 靜態(tài)方法 使用
@staticmethod
裝飾器定義。 - 類(lèi)方法 使用
@classmethod
裝飾器定義。
2.參數(shù):
- 靜態(tài)方法 不需要特定的第一個(gè)參數(shù),它們不能訪問(wèn)或修改類(lèi)的狀態(tài)或?qū)嵗臓顟B(tài)。
- 類(lèi)方法 的第一個(gè)參數(shù)總是指向類(lèi)本身,而不是實(shí)例。這個(gè)參數(shù)通常被命名為
cls
。
3.調(diào)用方式:
- 靜態(tài)方法 可以通過(guò)類(lèi)或其實(shí)例來(lái)調(diào)用。
- 類(lèi)方法 也可以通過(guò)類(lèi)或其實(shí)例來(lái)調(diào)用,但無(wú)論你如何調(diào)用它,它的第一個(gè)參數(shù)都是類(lèi)本身。
4.用途:
- 靜態(tài)方法 用于在不需要訪問(wèn)類(lèi)或?qū)嵗膶傩缘那闆r下執(zhí)行某些任務(wù)。它們是真正的“靜態(tài)”的,不依賴(lài)于類(lèi)或?qū)嵗臓顟B(tài)。
- 類(lèi)方法 主要用于需要訪問(wèn)類(lèi)屬性或修改類(lèi)的狀態(tài)的場(chǎng)景。例如,它們通常用于工廠方法,這些方法返回類(lèi)的實(shí)例。
示例:
class MyClass: class_var = "I'm a class variable" def __init__(self, value): self.instance_var = value @staticmethod def static_method(): return "I'm a static method!" @classmethod def class_method(cls): return f"I'm a class method! Access class_var: {cls.class_var}" # 使用 obj = MyClass("I'm an instance variable") print(MyClass.static_method()) # 輸出: I'm a static method! print(obj.class_method()) # 輸出: I'm a class method! Access class_var: I'm a class variable
6.修改類(lèi)/實(shí)例狀態(tài):
- 靜態(tài)方法 不能修改類(lèi)或?qū)嵗臓顟B(tài),因?yàn)樗鼈儾荒茉L問(wèn)這些狀態(tài)。
- 類(lèi)方法 可以修改類(lèi)的狀態(tài),但不能直接修改實(shí)例的狀態(tài)(除非你明確地傳遞了一個(gè)實(shí)例)。
總的來(lái)說(shuō),你應(yīng)該根據(jù)方法是否需要訪問(wèn)或修改類(lèi)或?qū)嵗臓顟B(tài)來(lái)決定使用靜態(tài)方法還是類(lèi)方法。如果方法不需要訪問(wèn)這些狀態(tài),那么它可能應(yīng)該是一個(gè)靜態(tài)方法。如果它需要訪問(wèn)或修改類(lèi)的狀態(tài),那么它應(yīng)該是一個(gè)類(lèi)方法。
5. self 在繼承中
當(dāng)我們使用繼承時(shí),self
在子類(lèi)中代表子類(lèi)的實(shí)例,這意味著它可以訪問(wèn)子類(lèi)和父類(lèi)中定義的屬性和方法。
class Vehicle: def __init__(self, brand): self.brand = brand def display(self): print(f"This vehicle is made by {self.brand}.") class Bike(Vehicle): def __init__(self, brand, model): super().__init__(brand) self.model = model def display(self): super().display() print(f"It's a {self.model} bike.")
在這個(gè)例子中,Bike
類(lèi)的 display
方法首先調(diào)用父類(lèi)的 display
方法,然后再輸出自己的信息。這是通過(guò) self
實(shí)現(xiàn)的,它在父類(lèi)和子類(lèi)中都代表 Bike
的實(shí)例。
3.總結(jié)
在Python的面向?qū)ο缶幊讨校?code>self 是一個(gè)核心概念,它代表了對(duì)象的實(shí)例。通過(guò) self
,對(duì)象的方法可以訪問(wèn)和修改它的屬性,調(diào)用其他方法,并支持繼承和多態(tài)。雖然它只是一個(gè)普通的參數(shù)名,但它在Python編程中有著特殊的意義,為編寫(xiě)清晰、結(jié)構(gòu)化和可維護(hù)的代碼提供了基礎(chǔ)。
到此這篇關(guān)于深入理解python中實(shí)例方法的第一個(gè)參數(shù)self的文章就介紹到這了,更多相關(guān)python self內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 中導(dǎo)入csv數(shù)據(jù)的三種方法
這篇文章主要介紹了Python 中導(dǎo)入csv數(shù)據(jù)的三種方法,內(nèi)容比較簡(jiǎn)單,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11手把手教你用python發(fā)送短消息(基于阿里云平臺(tái))
這篇文章主要介紹了手把手教你用python發(fā)送短消息(基于阿里云平臺(tái)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03matplotlib常見(jiàn)函數(shù)之plt.rcParams、matshow的使用(坐標(biāo)軸設(shè)置)
這篇文章主要介紹了matplotlib常見(jiàn)函數(shù)之plt.rcParams、matshow的使用(坐標(biāo)軸設(shè)置),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01pytorch torch.expand和torch.repeat的區(qū)別詳解
這篇文章主要介紹了pytorch torch.expand和torch.repeat的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11解決Keras TensorFlow 混編中 trainable=False設(shè)置無(wú)效問(wèn)題
這篇文章主要介紹了解決Keras TensorFlow 混編中 trainable=False設(shè)置無(wú)效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06Python 稀疏矩陣-sparse 存儲(chǔ)和轉(zhuǎn)換
這篇文章主要介紹了Python 稀疏矩陣-sparse 存儲(chǔ)和轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下2017-05-05詳解Python Celery和RabbitMQ實(shí)戰(zhàn)教程
這篇文章主要介紹了詳解Python Celery和RabbitMQ實(shí)戰(zhàn)教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01