1. 程式人生 > 其它 >Python的__init__簡單解釋

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 = n

self.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