DAY 28 類的定義和方法
知識點學習
1. 類的定義
在Python中,類是創建對象的模板。使用class
關鍵字來定義一個類。類名通常采用首字母大寫的命名方式(PascalCase)。
# 最簡單的類定義
class MyClass:pass # 使用pass占位符
類的定義就像是創建一個藍圖,比如要造汽車,類就是汽車的設計圖紙,而具體的汽車對象就是根據這個圖紙制造出來的實體車輛。
2. pass占位語句
pass
是Python中的占位語句,當需要在語法上需要代碼塊,但暫時不想寫具體內容時使用。它什么都不做,只是為了保證語法正確。
class EmptyClass:pass # 暫時沒有具體內容,但語法完整def empty_function():pass # 函數體暫時為空if True:pass # 條件語句暫時為空
3. 類的初始化方法
__init__
方法是類的構造方法,當創建類的實例時會自動調用。這就像是給新生兒起名字和登記基本信息的過程。
class Person:def __init__(self, name, age):"""初始化方法,創建Person對象時自動調用self: 代表類的實例本身name, age: 傳入的參數"""self.name = name # 實例屬性self.age = age # 實例屬性print(f"創建了一個名叫{name}的人,年齡{age}歲")# 創建對象時,__init__方法自動執行
person1 = Person("小明", 18) # 輸出:創建了一個名叫小明的人,年齡18歲
person2 = Person("小紅", 20) # 輸出:創建了一個名叫小紅的人,年齡20歲
4. 類的普通方法
普通方法是定義在類中的函數,用來實現類的功能。每個方法的第一個參數必須是self
,代表調用該方法的實例。
class Student:def __init__(self, name, score):self.name = nameself.score = scoredef introduce(self):"""自我介紹方法"""return f"我是{self.name},我的成績是{self.score}分"def is_pass(self):"""判斷是否及格"""return self.score >= 60def add_score(self, points):"""加分方法"""self.score += pointsprint(f"{self.name}加了{points}分,現在總分是{self.score}")# 使用示例
student = Student("李華", 75)
print(student.introduce()) # 我是李華,我的成績是75分
print(student.is_pass()) # True
student.add_score(10) # 李華加了10分,現在總分是85
5. 類的繼承
繼承是面向對象編程的重要特性,子類可以繼承父類的屬性和方法。這就像是孩子會遺傳父母的某些特征一樣。
屬性的繼承
class Animal:def __init__(self, name, species):self.name = nameself.species = speciesself.is_alive = True # 所有動物都是活著的class Dog(Animal): # Dog繼承Animaldef __init__(self, name, breed):super().__init__(name, "犬類") # 調用父類的__init__方法self.breed = breed # 子類特有的屬性# 創建對象
dog = Dog("旺財", "金毛")
print(f"名字:{dog.name}") # 繼承自父類的屬性
print(f"種類:{dog.species}") # 繼承自父類的屬性
print(f"品種:{dog.breed}") # 子類特有的屬性
print(f"是否存活:{dog.is_alive}") # 繼承自父類的屬性
方法的繼承
class Animal:def __init__(self, name):self.name = namedef eat(self):return f"{self.name}正在吃東西"def sleep(self):return f"{self.name}正在睡覺"class Cat(Animal):def __init__(self, name, color):super().__init__(name)self.color = colordef meow(self): # 子類特有的方法return f"{self.name}在喵喵叫"def eat(self): # 方法重寫return f"{self.name}優雅地吃著貓糧"# 使用示例
cat = Cat("咪咪", "白色")
print(cat.eat()) # 調用重寫后的方法:咪咪優雅地吃著貓糧
print(cat.sleep()) # 調用繼承的方法:咪咪正在睡覺
print(cat.meow()) # 調用子類特有方法:咪咪在喵喵叫
作業
題目1:定義圓(Circle)類
思路分析:
需要創建一個圓類,它應該能夠存儲半徑信息,并且能夠計算面積和周長。圓的面積公式是πr2,周長公式是2πr。
import mathclass Circle:def __init__(self, radius=1):self.radius = radiusdef calculate_area(self):area = math.pi * self.radius ** 2return round(area, 2)def calculate_circumference(self):circumference = 2 * math.pi * self.radiusreturn round(circumference, 2)circle = Circle(5)
print(f"半徑:{circle.radius}") # 輸出:半徑:5
print(f"面積:{circle.calculate_area()}") # 輸出:面積:78.54
print(f"周長:{circle.calculate_circumference()}") # 輸出:周長:31.42# 測試默認值
default_circle = Circle()
print(f"默認圓的半徑:{default_circle.radius}") # 輸出:默認圓的半徑:1
print(f"默認圓的面積:{default_circle.calculate_area()}") # 輸出:默認圓的面積:3.14
題目2:定義長方形(Rectangle)類
思路分析:
長方形類需要存儲長和寬兩個屬性,能夠計算面積(長×寬)和周長(2×(長+寬)),還要能判斷是否為正方形(長==寬)。
class Rectangle:def __init__(self, length=1, width=1):self.length = lengthself.width = widthdef calculate_area(self):return self.length * self.widthdef calculate_perimeter(self):return 2 * (self.length + self.width)def is_square(self):return self.length == self.widthrect = Rectangle(4, 6)
print(f"長:{rect.length}, 寬:{rect.width}") # 輸出:長:4, 寬:6
print(f"面積:{rect.calculate_area()}") # 輸出:面積:24
print(f"周長:{rect.calculate_perimeter()}") # 輸出:周長:20
print(f"是否為正方形:{rect.is_square()}") # 輸出:是否為正方形:Falsesquare = Rectangle(5, 5)
print(f"是否為正方形:{square.is_square()}") # 輸出:是否為正方形:True# 測試默認值
default_rect = Rectangle()
print(f"默認長方形:長={default_rect.length}, 寬={default_rect.width}") # 輸出:默認長方形:長=1, 寬=1
print(f"默認長方形是否為正方形:{default_rect.is_square()}") # 輸出:默認長方形是否為正方形:True
題目3:圖形工廠
思路分析:
工廠函數是一種設計模式,根據不同的參數創建不同類型的對象。需要創建一個函數,根據傳入的圖形類型參數來決定創建圓還是長方形對象。
def create_shape(shape_type, *args):if shape_type == "circle":# 創建圓對象,參數為半徑if len(args) == 0:return Circle() # 使用默認半徑else:return Circle(args[0]) # 使用傳入的半徑elif shape_type == "rectangle":# 創建長方形對象,參數為長和寬if len(args) == 0:return Rectangle() # 使用默認值elif len(args) == 1:# 如果只傳入一個參數,創建正方形return Rectangle(args[0], args[0])else:return Rectangle(args[0], args[1]) # 使用傳入的長和寬else:raise ValueError(f"不支持的圖形類型:{shape_type}")shape1 = create_shape("circle", 5)
print(f"圓的周長:{shape1.calculate_circumference()}") # 輸出:圓的周長:31.42shape2 = create_shape("rectangle", 3, 4)
print(f"長方形是否為正方形:{shape2.is_square()}") # 輸出:長方形是否為正方形:False# 更多測試示例
print("\n=== 更多測試示例 ===")# 創建默認圓
default_circle = create_shape("circle")
print(f"默認圓的面積:{default_circle.calculate_area()}")# 創建正方形(只傳入一個參數)
square_shape = create_shape("rectangle", 6)
print(f"正方形的面積:{square_shape.calculate_area()}")
print(f"是否為正方形:{square_shape.is_square()}")# 創建默認長方形
default_rect = create_shape("rectangle")
print(f"默認長方形的周長:{default_rect.calculate_perimeter()}")# 錯誤處理示例
try:error_shape = create_shape("triangle", 3, 4, 5)
except ValueError as e:print(f"錯誤:{e}")
完整示例代碼
import math# 圓類
class Circle:def __init__(self, radius=1):self.radius = radiusdef calculate_area(self):area = math.pi * self.radius ** 2return round(area, 2)def calculate_circumference(self):circumference = 2 * math.pi * self.radiusreturn round(circumference, 2)# 長方形類
class Rectangle:def __init__(self, length=1, width=1):self.length = lengthself.width = widthdef calculate_area(self):return self.length * self.widthdef calculate_perimeter(self):return 2 * (self.length + self.width)def is_square(self):return self.length == self.width# 圖形工廠函數
def create_shape(shape_type, *args):if shape_type == "circle":if len(args) == 0:return Circle()else:return Circle(args[0])elif shape_type == "rectangle":if len(args) == 0:return Rectangle()elif len(args) == 1:return Rectangle(args[0], args[0])else:return Rectangle(args[0], args[1])else:raise ValueError(f"不支持的圖形類型:{shape_type}")# 綜合測試
if __name__ == "__main__":print("=== DAY 28 類的定義和方法 測試 ===\n")# 測試圓類print("1. 圓類測試:")circle = Circle(5)print(f"半徑:{circle.radius}")print(f"面積:{circle.calculate_area()}")print(f"周長:{circle.calculate_circumference()}")# 測試長方形類print("\n2. 長方形類測試:")rect = Rectangle(4, 6)print(f"長:{rect.length}, 寬:{rect.width}")print(f"面積:{rect.calculate_area()}")print(f"周長:{rect.calculate_perimeter()}")print(f"是否為正方形:{rect.is_square()}")square = Rectangle(5, 5)print(f"正方形是否為正方形:{square.is_square()}")# 測試圖形工廠print("\n3. 圖形工廠測試:")shape1 = create_shape("circle", 5)print(f"工廠創建的圓的周長:{shape1.calculate_circumference()}")shape2 = create_shape("rectangle", 3, 4)print(f"工廠創建的長方形是否為正方形:{shape2.is_square()}")
@浙大疏錦行