網站首頁 編程語言 正文
__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的省略形式),在使用類創(chuàng)建對象之后被執(zhí)行,用于給新創(chuàng)建的對象初始化屬性用。
初始化屬性的語句就是self.name = name
這種了,這一句不太好理解,我們把它改編一下就好理解了:
def __init__(self, n, a): self.name = n self.age = a
首先這是一個方法,方法的形參有self,n和a三個。
這個self,表示對象本身,誰調用,就表示誰(這句話不好理解,先記住,我們后面分析)。
語法上,類中的方法的第一個參數都是self,這是和普通方法區(qū)別的地方。
這里self.name = n
和self.age = a
表示將外部傳來的n和a,賦值給了self對象的name和age屬性。
這里的n和a,其實叫什么都可以,但是會有個問題:一般我們調用方法的時候,想自動提示一下或者查看文檔看一下這個方法的參數要求,如果形參名都是n、a、m、i這些,會讓人摸不著頭腦,不知道到底該傳入什么樣的實參。因為這里我們傳入實參是為了給屬性賦值,為了能見名知意,將形參的名字定義的跟屬性一致,調用者就知道該怎么傳參了。
所以才有了上面的寫法。
再來說創(chuàng)建對象:p = Person('小明', 20)
這句話就創(chuàng)建出來了一個具體的人,并且給這個人起了個名字叫小明,指定了小明的年齡為20,并且將小明這個對象賦值給了變量p,此時p就表示小明這個人(對象)
這就造出了一個人。
注:這里的小明和20并不是任意創(chuàng)造的,而是在Person這個函數中定義了2個參數(name,age),所以這必須實例化2個參數!! 另外,在重復一下這個流程吧:定義類(class )-創(chuàng)建方法(對象)(def)——創(chuàng)建實例(綁定屬性)(p=類名)——傳參(有init的不需要單獨傳參)-調用
代碼如下:
# 定義一個類,使用class關鍵字 class Student: pass # 暫時不賦值 #創(chuàng)建類的對象 stu1 = Student() # 創(chuàng)建Student類的一個實例 stu2 = Student() print(stu1,'自定義類型type:',type(stu1)) print(stu2,'自定義類型type:',type(stu2)) # 為對象綁定屬性 (注:需要先給類創(chuàng)建實例) 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的參數
插入:這里就是人們常常調侃的,程序員不需要女朋友,如果需要,就給自己創(chuàng)建一個對象,不,最少要創(chuàng)建10個對象!!! 對象就是傳的參
就是這樣:
#創(chuàng)建類 class GirlFriend : #創(chuàng)建方法 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__直接輸出(不建議這么用)
這種構造方法,在創(chuàng)建對象時會自動調用, 不需要單獨調用該方法! 不建議這么用
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')
在執(zhí)行結果中可以看出,用了init就需要在定義對象的時候就賦值,而不用init的話,是不需要再定義對象的時候就賦值,需要單獨傳參,但是因為在test中定義了name,所以在調用的時候,也需要傳一個參數,但如果不用init,在調用的時候傳參,是沒有任何意義的,因為類中的方法默認接受的參數是單獨定義的參數,而不是是調用的時候傳的參!!!
總結
反正你需要知道的是,__init__是構造方法,在創(chuàng)建對象時會自動調用,而且構造方法(函數),不支持重載,如果需要給這個類定義參數,就需要用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()
原文鏈接:https://blog.csdn.net/cuichongxin/article/details/109580807
相關推薦
- 2022-07-21 python:實現balanced parentheses平衡括號表達式算法(附完整源碼)
- 2022-11-14 python中的運算符
- 2022-08-02 Android中TextView自動適配文本大小的幾種解決方案_Android
- 2022-05-03 基于R語言?數據檢驗詳解_R語言
- 2022-06-30 Python函數和文件操作詳情_python
- 2022-11-17 C語言數據結構不掛科指南之棧&隊列&數組詳解_C 語言
- 2024-07-15 redis中存儲list<map>,list<entity>結構數據如何處理
- 2022-06-07 nlp自然語言處理學習CBOW模型類實現示例解析_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支