Python的__init__簡單解釋



以下內容為節選:

1 class Person:
2     def __init__(self, name, age):
3         self.name = name
4         self.agclass Person:
5     def __init__(self, name, age):
6         self.name = name
7         self.age = agee = age

 

class關鍵字后面跟類的名稱就定義了一個類,類的名稱可以任意,采用駝峰命名法,也即每個單詞的首字母大寫,如Book、Person、WildAnimal等

這里的__init__方法是一個特殊的方法(init是單詞初始化initialization的省略形式),在使用類創建對象之后被執行,用於給新創建的對象初始化屬性用。
初始化屬性的語句就是self.name = name這種了,這一句不太好理解,我們把它改編一下就好理解了:

1 def __init__(self, n, a):
2     self.name = n
3     self.age = a

 

首先這是一個方法,方法的形參有self,n和a三個。
這個self,表示對象本身,誰調用,就表示誰(這句話不好理解,先記住,我們后面分析)。
語法上,類中的方法的第一個參數都是self,這是和普通方法區別的地方。
這里self.name = nself.age = a表示將外部傳來的n和a,賦值給了self對象的name和age屬性。
這里的n和a,其實叫什么都可以,但是會有個問題:一般我們調用方法的時候,想自動提示一下或者查看文檔看一下這個方法的參數要求,如果形參名都是n、a、m、i這些,會讓人摸不着頭腦,不知道到底該傳入什么樣的實參。因為這里我們傳入實參是為了給屬性賦值,為了能見名知意,將形參的名字定義的跟屬性一致,調用者就知道該怎么傳參了。
所以才有了上面的寫法。

再來說創建對象:

p = Person('小明', 20)

 

這句話就創建出來了一個具體的人,並且給這個人起了個名字叫小明,指定了小明的年齡為20,並且將小明這個對象賦值給了變量p,此時p就表示小明這個人(對象)

這就造出了一個人。

既然你是神,當然想造出什么樣的人都可以,比如造出一個200歲的叫傑拉考的人:

p = Person('傑拉考', 200)

 

這句話后面的Person('傑拉考', 200)用於創建出了一個對象(人),並且調用了init(self,name,age)方法完成了該人的屬性的初始化,傑拉考賦值給了name200賦值給了age屬性。
self呢?self不需要傳參,上面我們說過,self,表示對象本身,誰調用,就表示誰,此時的self就表示你Person('傑拉考', 200)創造出來的那個對象,也即是p
也即,我們創造出了p,然后給p的屬性賦了值,此時p就表示擁有屬性值之后的那個人。

可以使用點.來調用對象的屬性,比如輸出p的名字和年齡,完整代碼為:

1 class Person:
2     def __init__(self, name, age):
3         self.name = name
4         self.age = age
5 p = Person('傑拉考', 200)
6 print(p.name)
7 print(p.age)

 

輸出結果:

傑拉考
200

 

接下來我們再在Person類中定義一個方法,用於自我介紹:

1 def desc(self):
2     print("我叫%s,今年%d歲" % (self.name, self.age))

 

在類的內部,訪問自己的屬性和方法,都需要通過self,self就是外部對象在類內部的表示,此時可以使用p調用該方法,完整代碼如下:

1 class Person:
2     def __init__(self, name, age):
3         self.name = name
4         self.age = age
5     def desc(self):
6         print("我叫%s,今年%d歲" % (self.name, self.age))
7 p = Person('傑拉考', 200)
8 # 調用自我介紹方法 desc方法中的self就是外部的這個p
9 p.desc()

 

輸出為:

我叫傑拉考,今年200歲

 

當前desc方法中的self,就是外部的那個對象p,如果我再定義了一個對象p2,那么p2調用desc時,desc中的self就表示p2這個對象。正所謂:誰調用,就表示誰

 

轉載:
鏈接:https://www.zhihu.com/question/46973549/answer/293788116

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM