day 28
類是對屬性和方法的封裝,可以理解為模版,通過對模型實例化可以實現調用這個類的屬性和方法。比如創建一個隨機森林類,然后就可以調用它的訓練和預測方法。
一個常見的類的定義包括了:
1、關鍵字class
2、類名
3、語法固定符號冒號(:)
4、一個初始化函數_init_(self)
注意:init左右各有兩個下劃線——,需要傳入self 這個特殊的參數。
Pass 占位符和縮進
class ClassName:# 類名通常遵循大駝峰命名法(UpperCamelCase)單詞的首字母大寫,class 是定義類的關鍵詞#類的代碼(包含屬性定義、方法定義等)pass # pass 是一個占位符,表示這里暫時沒有任何內容。class ClassName: # 類名通常遵循大駝峰命名法 (UpperCamelCase),即每個單詞的首字母都大寫,# # 類的代碼塊 (可以包含屬性定義、方法定義等)# pass # pass 是一個占位符,表示這里暫時沒有任何內容
許多時候,當規劃好準備寫一個函數、或者一個類,關鍵詞定義后,會先用pass 占位,避免 運行錯誤,等到想好些什么再去不補充。
比如def 、class 這些定義的關鍵詞后,必須有一個占據縮進位置的代碼塊。
還有下面這些依賴縮緊的語句,都可以用pass 占位。# 條件語句
x=10
if x>5:pass
else:print ("x is not greater than 5")
# 循環語句
for i in range(3):pass
try:# 嘗試執行的代碼print("hhh")
except SomeException:pass# 異常處理代碼
finally:pass總結:python 通過縮進來定義代碼塊的結構。當解釋器遇到像def,class,if , for 這也樣的語句,并且后面跟冒號時,他就期望接下來會有一個或多個縮進的語句來構成這個代碼塊。如果他沒有找到任何縮進的語句。它就無法確定這個結構的范圍,因此會拋出indentationError 異常。
pass 語句的存在就是為了解決這個問題:她本身不執行任何操作,但它是一個有效的python語句。所以,當你需要一個語法上存在的代碼塊,但是暫時又不想在其中放入任何實際的邏輯時,pass就是一個完美的占位符,她告訴解釋器:這里有一個代碼塊,但是她什么不做。
類的初始化方法
初始化方法又叫構造方法、特殊方法
類的兩種方法
1、初始化方法
2、普通放大
class Teacher:def __init__(self):self.name="susan"self.subject="python"self.age=30
teacher=Teacher()
print(teacher.name)class Teacher:def __init__(self,name,age):self.name=nameself.subject="python"self.age=age
teacher=Teacher("susan",30)
print(teacher.name)
print(teacher.age)
print(teacher.subject)其中,self.xx 是用來表明這個屬性,歸屬性這個類自己的self。比如self.name,就是代表著:自己的名字,self等于自己,這個self指向類的實例化地址,傳入的self.xx是他的屬性。以后要是用它自己的屬性值,即使是從外界參數傳入,前面也必須加上self.xx,否則傳入的參數沒價值。類的普通方法
除了init 方法,(初始化方法,又名構造方法)還包含一些普通方法(自己定義)
普通方法和init方法的差別在于,init方法是類的構造方法,當創建對象時,會自動調用init 方法。只要你創建這個類的對象了,這個init 函數就會執行。
普通方法是只有你調用類的這個方法的時候,函數次才執行。class Teacher:def __init__(self):self.name="susan"self.subject="python"self.age=30def teach_lesson(self):print("上課中")def criticize(self):print ("批評人")
t=Teacher()
t.teach_lesson()
t.criticize()
print(t.name)
類的繼承
類已經是比較優秀的封裝了,封裝了函數、封裝了屬性
如同裝飾器進一步封裝了函數的可復用的功能,裝飾器函數封裝了函數
那么有沒有東西可以一步封裝類呢?這就引出了類的繼承。
在面向對象編程中,繼承允許一個類繼承另一個類(父類)的屬性和方法,從而實現代碼復用和功能擴展。子類可以:
1、復用父類的代碼(無需重新實現)
2、重寫父類的方法(修改或增強功能)
3、添加新的方法和屬性(擴展功能)
# 先沿用之前定義的teacher類
class Teacher:def __init__(self,name,subject,age):self.name=nameself.subject=subjectself.age=agedef teach_lesson(self):print(f"{self.name}正在教{self.subject}")def criticize(self,student_name):print(f"{self.name}正在批評學生{student_name}")# 繼承Teacher 類,起名特教教師
class MasterTeacher(Teacher):def __init__(self,name,subject,age,experience_years):# 調用父類的構造方法初始化基本屬性super().__init__(name,subject,age)# 4、此時子類自動擁有了父類的屬性和方法# 添加子類特有的屬性self.experience_years=experience_years# 重寫父類方法,增強功能-----如果子類定義了與父類同名的方法,子類實例會優先調用子類的方法def teach_lesson(self):print(f"{self.name}正在教{self.subject}")# 新增子類特有的方法def give_lecture (self,topic):print(f"{self.name}正在給學生講解{topic}")
# 創建子類實列
master=MasterTeacher("高教授","數學",30,10)
# 調用繼承的方法
master.teach_lesson()
master.criticize("李同學")
# 調用子類特有的方法
master.give_lecture("導數")# super ()函數,除了在構造方法中使用,還可以在其他方法中使用
# 定義一個父類
class Animal:def __init__(self,name,age):self.name=nameself.age=agedef speak(self):print(f"{self.name}發出聲音")
class Dog(Animal):def speak(self):super().speak()print("汪汪")
dog=Dog("旺財",3)
dog.speak()
所以重寫父類的方法,也包含2種:
1、直接重寫:本質是會優先用子類的同名方法,完全替代父類方法,父類邏輯不會執行。
2、使用supper() 重寫,保留父類方法分核心邏輯,并在其基礎上擴展。
@ 浙大疏錦行