首頁 > 軟體

一文掌握python中的__init__的意思及使用場景分析

2023-02-12 06:00:58

__init__解釋

__init__是構造方法,誰呼叫,表示誰(更直觀的理解就是類的方法中,誰呼叫,表示誰,見下面第一個程式碼)!!並不是必選項,也就是說在類中,這個不是必須用的,那什麼場景需要用到,什麼場景不需要用到呢,下面會做說明!
下面程式碼是最基本的類定義程式碼:

class Person:
    def __init__(self, name, age):
        self.name = name
#self.name,這裡的name並不是 def __init__裡面的name,這個name可以自定義,但=後面的name就是__init__裡面的name了
        self.age = age
	def test(self):
	#誰呼叫表示誰,就是這種情況,這個test方法呼叫了這個類中init的name和age,也就是說這個類的name和age表示為test方法
	print(self.name,self,age)

class關鍵字後面跟類的名稱就定義了一個類,類的名稱可以任意,採用駝峰命名法,也即每個單詞的首字母大寫,如Book、Person、WildAnimal等
這裡的__init__方法是一個特殊的方法(init是單詞初始化initialization的省略形式),在使用類建立物件之後被執行,用於給新建立的物件初始化屬性用。
初始化屬性的語句就是self.name = name這種了,這一句不太好理解,我們把它改編一下就好理解了:

def __init__(self, n, a):
    self.name = n
    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就表示小明這個人(物件)
這就造出了一個人。
注:這裡的小明和20並不是任意創造的,而是在Person這個函數中定義了2個引數(name,age),所以這必須範例化2個引數!! 另外,在重複一下這個流程吧:定義類(class )-建立方法(物件)(def)——建立範例(繫結屬性)(p=類名)——傳參(有init的不需要單獨傳參)-呼叫
程式碼如下:

# 定義一個類,使用class關鍵字
class Student:
    pass # 暫時不賦值

#建立類的物件
stu1 = Student() # 建立Student類的一個範例
stu2 = Student()
print(stu1,'自定義型別type:',type(stu1))
print(stu2,'自定義型別type:',type(stu2))
# 為物件繫結屬性 (注:需要先給類建立範例)
stu1.name = 'ccx'
stu1.age = 22
stu2.name = 'xgq'
stu2.age = 23
stu2.sex = 'woman'
# 呼叫
print('stu1的引數:',stu1.name,stu1.age) #列印stu1的引數
print('stu2的引數:',stu2.name,stu2.sex,stu2.age) # 列印stu2的引數

插入:這裡就是人們常常調侃的,程式設計師不需要女朋友,如果需要,就給自己建立一個物件,不,最少要建立10個物件!!! 物件就是傳的參
就是這樣:

#建立類
class GirlFriend :
	#建立方法
	def __init__(self,num,name,age,features):
		#初始化引數
		self.num=num
		self.name=name
		self.age=age
		self.features=features
	def MyGirlFriend(self):
		print('我的第',self.num,'個女朋友,名字叫',self.name,',她今年',self.age,'歲了,特徵是:',self.features,'!!!!',sep='')
# 定義物件
gf1=GirlFriend(1,'劉亦菲',24,'漂亮的臉蛋性感的身材')
gf2=GirlFriend(2,'楊冪',23,'有讓人陶醉的聲音')
gf3=GirlFriend(3,'湯唯',24,'喜歡沒道理')
#呼叫
gf1.MyGirlFriend()
gf2.MyGirlFriend()
gf3.MyGirlFriend()

用__init__與不用__init__對比

__init__直接輸出(不建議這麼用)

這種構造方法,在建立物件時會自動呼叫, 不需要單獨呼叫該方法! 不建議這麼用

class ClassName(object):
	def __init__(self, name):
# 必須要初始化值
		self.name=name
		print('ClassName:',self.name,'in run')
p=ClassName('xgq')

__init__普通用法

init只是用來初始化值,但都需要新定義方法來返回這個引數!!!

class ClassName(object):
	def __init__(self, name):
		self.name=name
	def run(self):
		print('ClassName_run:',self.name,'in run')
p=ClassName('xgq')
p.run()

不用__init__

#定義類
class Person:
	#定義方法
	def test(self,name):
		print('name is :',self.name,'~!!!')
#定義物件
p=Person()
#傳參
p.name='ccx'
#呼叫
p.test('xgq')

在執行結果中可以看出,用了init就需要在定義物件的時候就賦值,而不用init的話,是不需要再定義物件的時候就賦值,需要單獨傳參,但是因為在test中定義了name,所以在呼叫的時候,也需要傳一個引數,但如果不用init,在呼叫的時候傳參,是沒有任何意義的,因為類中的方法預設接受的引數是單獨定義的引數,而不是是呼叫的時候傳的參!!!

總結

反正你需要知道的是,__init__是構造方法,在建立物件時會自動呼叫,而且構造方法(函數),不支援過載,如果需要給這個類定義引數,就需要用init,反正就不需要用!

下面我給一個 子類繼承父類別的方法,如果不用init你可以自行嘗試是什麼結果!!

#定義一個Person類,父類別(超類,基礎類別)
class Person:
    def __init__(self,name): # 定義私有類
        self.name = name
    def run(self):#定義一個類函數
        print('person:'+ self.name+'正在奔跑啊啊啊')

class Student(Person): #繼承自Person
    def __init__(self,name,set,age):# 定義私有類
        #呼叫父類別的構造方法
       # Person.__init__(name) # 方式一:直接指定父類別的構造方法
        super().__init__(name)# 方式二:使用super(),推薦使用該方法
        # 自己類中的構造方法且父類別中沒有的,直接定義即可
        self.set = set
        self.age = age
    def study(self): #定義一個類函數
        print('stadent:' + self.name + '正在學習。。。。')
    def show(self):#定義一個類函數
        print('name:%s , set:%s,age:%s'%(self.name,self.set,self.age))
    #可以自定義n個類函數 。。。

stu = Student('ccx','man',22)
stu.run() #因為繼承了父類別,當然也可以直接呼叫父類別函數
stu.study()
stu.show()

到此這篇關於一文搞懂python中的__init__的意思及使用場景的文章就介紹到這了,更多相關python中的__init__使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com