Python方法中self和parent參數(shù)用法詳解
Python 方法中的 self 和 parent 參數(shù)用法
大家好!今天我們來(lái)聊一個(gè) Python 中常見(jiàn)但可能讓人困惑的話題:方法參數(shù)里的 self 和 parent。如果你是 Python 新手,或者對(duì)這兩者感到疑惑,別擔(dān)心!在這篇博客中,我會(huì)分三個(gè)章節(jié)逐步講解它們的含義、作用和實(shí)際應(yīng)用,帶你徹底搞懂它們。讓我們開(kāi)始吧!
第一章:揭秘 self —— 實(shí)例方法的必備參數(shù)
在 Python 的類(lèi)中,你會(huì)經(jīng)??吹椒椒ǘx時(shí)第一個(gè)參數(shù)是 self,比如下面這個(gè)例子:
class Dog:
def __init__(self, name):
self.name = name
def bark(self):
print(f"{self.name} says woof!")
調(diào)用時(shí)是這樣的:
my_dog = Dog("Buddy")
my_dog.bark() # 輸出: Buddy says woof!
self 是什么?
簡(jiǎn)單來(lái)說(shuō),self 是當(dāng)前實(shí)例的引用。當(dāng)你創(chuàng)建一個(gè)對(duì)象(比如 my_dog),然后調(diào)用它的方法時(shí),self 就代表這個(gè)對(duì)象本身。它讓方法知道“我在操作哪個(gè)實(shí)例”。
為什么需要 self?
- 區(qū)分實(shí)例:假如你創(chuàng)建了多個(gè)
Dog對(duì)象(比如Dog("Buddy")和Dog("Max")),每個(gè)對(duì)象都有自己的name屬性。self確保方法操作的是正確的實(shí)例。比如調(diào)用my_dog.bark()時(shí),self指向my_dog,所以輸出的名字是"Buddy"。 - 訪問(wèn)屬性和方法:通過(guò)
self,方法可以訪問(wèn)實(shí)例的屬性(self.name)或調(diào)用其他方法。這是 Python 實(shí)現(xiàn)對(duì)象狀態(tài)管理的基礎(chǔ)。 - Python 的顯式設(shè)計(jì):不像某些語(yǔ)言(比如 Java 的
this是隱式的),Python 要求顯式寫(xiě)出self。這讓代碼更清晰,開(kāi)發(fā)者能一眼看出方法是在操作實(shí)例。
工作原理
當(dāng)你調(diào)用 my_dog.bark() 時(shí),Python 實(shí)際上在背后是這樣執(zhí)行的:
Dog.bark(my_dog)
這里,my_dog 被自動(dòng)作為第一個(gè)參數(shù)傳給 bark 方法,而這個(gè)參數(shù)就是 self。
小結(jié)
self 是 Python 實(shí)例方法的必需參數(shù),它代表調(diào)用方法的實(shí)例本身。沒(méi)有 self,方法就無(wú)法知道自己在操作哪個(gè)對(duì)象的數(shù)據(jù)。理解了這一點(diǎn),你就掌握了 Python 類(lèi)的基礎(chǔ)!
第二章:探索 parent —— 自定義的層次參數(shù)
相比 self,parent 在 Python 方法中出現(xiàn)的頻率低得多,而且它并不是語(yǔ)言內(nèi)置的要求。那為什么有些代碼里會(huì)有 parent 參數(shù)呢?讓我們來(lái)看看。
parent 的常見(jiàn)場(chǎng)景
parent 通常是開(kāi)發(fā)者根據(jù)程序設(shè)計(jì)需要引入的,表示一個(gè)對(duì)象與其“父對(duì)象”之間的關(guān)系。以下是幾種典型情況:
樹(shù)形結(jié)構(gòu)或?qū)哟侮P(guān)系
在樹(shù)形結(jié)構(gòu)(如文件系統(tǒng)或家族樹(shù))中,每個(gè)節(jié)點(diǎn)可能需要知道它的父節(jié)點(diǎn)。這時(shí),parent可以作為參數(shù)或?qū)傩猿霈F(xiàn)??催@個(gè)例子:
class TreeNode:
def __init__(self, name, parent=None):
self.name = name
self.parent = parent # 保存父節(jié)點(diǎn)引用
self.children = []
def add_child(self, child_name):
child = TreeNode(child_name, parent=self)
self.children.append(child)
這里,每個(gè)
TreeNode對(duì)象通過(guò)parent參數(shù)保存它的父節(jié)點(diǎn),形成一個(gè)層次結(jié)構(gòu)。嵌套類(lèi)
當(dāng)一個(gè)類(lèi)嵌套在另一個(gè)類(lèi)中時(shí),內(nèi)層類(lèi)可能需要訪問(wèn)外層類(lèi)的實(shí)例。這時(shí)可以用parent參數(shù)傳遞外層實(shí)例:
class Outer:
def __init__(self):
self.inner = self.Inner(self)
class Inner:
def __init__(self, parent):
self.parent = parent # 保存外層實(shí)例
繼承中的特殊用法(不常見(jiàn))在繼承中,子類(lèi)通常用
super()訪問(wèn)父類(lèi)方法。但在某些自定義場(chǎng)景下,開(kāi)發(fā)者可能用parent表示父類(lèi)的實(shí)例。不過(guò),這種用法不推薦,因?yàn)?nbsp;super()已經(jīng)足夠強(qiáng)大。
parent 和 self 的區(qū)別
self:始終指向當(dāng)前實(shí)例,是 Python 的內(nèi)置約定。parent:指向另一個(gè)相關(guān)對(duì)象(通常是父對(duì)象),是開(kāi)發(fā)者根據(jù)需求定義的。
小結(jié)
parent 不是 Python 的標(biāo)準(zhǔn)參數(shù),而是特定場(chǎng)景下的設(shè)計(jì)選擇。它常用于表示對(duì)象間的層次關(guān)系,比如樹(shù)形結(jié)構(gòu)或嵌套類(lèi)。是否使用 parent,完全取決于你的程序邏輯。
第三章:實(shí)戰(zhàn)演練 —— 示例與最佳實(shí)踐
理論講完了,我們通過(guò)實(shí)際代碼來(lái)加深理解吧!
示例 1:使用 self 的簡(jiǎn)單類(lèi)
class Car:
def __init__(self, make, model):
self.make = make
self.model = model
def display_info(self):
print(f"This car is a {self.make} {self.model}.")
# 使用
my_car = Car("Toyota", "Corolla")
my_car.display_info() # 輸出: This car is a Toyota Corolla.
這里,self 讓 display_info 方法能訪問(wèn)實(shí)例的 make 和 model 屬性。
示例 2:使用 parent 的樹(shù)形結(jié)構(gòu)
class TreeNode:
def __init__(self, name, parent=None):
self.name = name
self.parent = parent
self.children = []
def add_child(self, child_name):
child = TreeNode(child_name, parent=self)
self.children.append(child)
def display(self, level=0):
print(" " * level + self.name)
for child in self.children:
child.display(level + 1)
# 使用
root = TreeNode("Root")
root.add_child("Child1")
root.add_child("Child2")
root.children[0].add_child("Grandchild1")
root.display()
# 輸出:
# Root
# Child1
# Grandchild1
# Child2
在這個(gè)樹(shù)形結(jié)構(gòu)中,parent 參數(shù)幫助每個(gè)節(jié)點(diǎn)記住它的父節(jié)點(diǎn),self 則用于管理每個(gè)節(jié)點(diǎn)的屬性和行為。
最佳實(shí)踐
- 始終使用
self:在實(shí)例方法中,self是必須的,別忘了寫(xiě)! - 謹(jǐn)慎使用
parent:只有在需要明確層次關(guān)系時(shí)才用parent,否則會(huì)讓代碼復(fù)雜化。 - 保持清晰:命名要直觀,避免混淆
self和parent的角色。
總結(jié)
self:Python 實(shí)例方法的靈魂,表示當(dāng)前實(shí)例,是訪問(wèn)對(duì)象數(shù)據(jù)和行為的橋梁。parent:自定義參數(shù),用于表示對(duì)象間的某種關(guān)系(通常是父子關(guān)系),在特定場(chǎng)景下很有用。
希望這篇博客能解開(kāi)你對(duì) self 和 parent 的疑惑!掌握了這些,你的 Python 面向?qū)ο缶幊虝?huì)更上一層樓。
到此這篇關(guān)于Python方法中self和parent參數(shù)用法詳解的文章就介紹到這了,更多相關(guān)Python self和parent用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python?flask框架post接口調(diào)用示例
這篇文章主要介紹了Python?flask框架post接口調(diào)用,結(jié)合實(shí)例形式分析了基于flask框架的post、get請(qǐng)求響應(yīng)及接口調(diào)用相關(guān)操作技巧,需要的朋友可以參考下2019-07-07
pyecharts如何旋轉(zhuǎn)折線圖的X軸標(biāo)簽
這篇文章主要介紹了pyecharts如何旋轉(zhuǎn)折線圖的X軸標(biāo)簽,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
python之線程通過(guò)信號(hào)pyqtSignal刷新ui的方法
今天小編就為大家分享一篇python之線程通過(guò)信號(hào)pyqtSignal刷新ui的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
Python實(shí)現(xiàn)連接MySQL數(shù)據(jù)庫(kù)的常見(jiàn)方法總結(jié)
這篇文章主要為大家介紹了兩種Python中用來(lái)連接 MySQL 數(shù)據(jù)庫(kù)的方法,并且針對(duì)這兩種方法,我們還將對(duì)代碼進(jìn)行封裝和優(yōu)化,提高程序的可讀性和健壯性,需要的可以收藏一下2023-05-05
解決django框架model中外鍵不落實(shí)到數(shù)據(jù)庫(kù)問(wèn)題
這篇文章主要介紹了解決django框架model中外鍵不落實(shí)到數(shù)據(jù)庫(kù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
使用Pytorch實(shí)現(xiàn)Swish激活函數(shù)的示例詳解
激活函數(shù)是人工神經(jīng)網(wǎng)絡(luò)的基本組成部分,他們將非線性引入模型,使其能夠?qū)W習(xí)數(shù)據(jù)中的復(fù)雜關(guān)系,Swish 激活函數(shù)就是此類(lèi)激活函數(shù)之一,在本文中,我們將深入研究 Swish 激活函數(shù),提供數(shù)學(xué)公式,探索其相對(duì)于 ReLU 的優(yōu)勢(shì),并使用 PyTorch 演示其實(shí)現(xiàn)2023-11-11

