day28/60
@浙大疏锦行
DAY 28 类的定义和方法
PS:每天的内容都有示例代码的,在gitee主页 不是只有讲义的几句话,,不会还有人不知道吧
知识点回顾:
- 类的定义
- pass占位语句
- 类的初始化方法
- 类的普通方法
- 类的继承:属性的继承、方法的继承
作业
题目1:定义圆(Circle)类
要求:
- 包含属性:半径 radius。
- 包含方法:
- calculate_area():计算圆的面积(公式:πr²)。
- calculate_circumference():计算圆的周长(公式:2πr)。
- 初始化时需传入半径,默认值为 1。
# 示例运行
circle = Circle(5)
print(f"半径:{circle.radius}") # 输出:半径:5
print(f"面积:{circle.calculate_area()}") # 输出:面积:78.54(保留两位小数)
print(f"周长:{circle.calculate_circumference()}") # 输出:周长:31.42(保留两位小数)
题目2:定义长方形(Rectangle)类
- 包含属性:长 length、宽 width。
- 包含方法:
- calculate_area():计算面积(公式:长×宽)。
- calculate_perimeter():计算周长(公式:2×(长+宽))。 is_square() 方法,判断是否为正方形(长 == 宽)。
- 初始化时需传入长和宽,默认值均为 1。
rect = 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
题目3:图形工厂
创建一个工厂函数 create_shape(shape_type, *args),根据类型创建不同图形对象:图形工厂(函数或类)
shape_type="circle":创建圆(参数:半径)。
shape_type="rectangle":创建长方形(参数:长、宽)。
shape1 = create_shape("circle", 5)
print(shape1.calculate_circumference()) # 输出:31.42shape2 = create_shape("rectangle", 3, 4)
print(shape2.is_square()) # 输出:False
豆包:
好的!我会用生活中的例子来比喻这几个面向对象编程的核心概念,让它们更容易理解~
1. 类的定义
知识点解释:
类是一种抽象的模板,定义了对象的属性(特征)和方法(行为)。通过类可以创建多个具有相同结构的实例对象。
比喻:
就像制作饼干的模具:
- 模具(类)决定了饼干(对象)的形状(属性)和用途(方法),
- 用同一个模具可以做出很多块饼干(实例化多个对象),
- 每块饼干都有相同的基本特征(如圆形、巧克力味),但可以独立存在和使用。
代码示例:
python
class Cookie: # 定义一个饼干类shape = "圆形" # 类属性:所有饼干的形状flavor = "巧克力" # 类属性:所有饼干的口味def eat(self): # 类方法:描述饼干的行为print(f"吃掉了一块{self.shape}的{self.flavor}饼干!")# 创建两个饼干实例
cookie1 = Cookie()
cookie2 = Cookie()cookie1.eat() # 输出:吃掉了一块圆形的巧克力饼干!
2. pass 占位语句
知识点解释:
pass
是一个空语句,用于占位,让代码结构完整但暂时不执行任何操作。常见于类或函数定义中,当你还没想好具体实现时使用。
比喻:
就像给房子设计蓝图:
- 你在图纸上标记了 “这里将来要放一个沙发”(定义了一个方法或类),
- 但现在还没决定买什么样的沙发(还没写具体代码),
- 先用
pass
占个位,确保图纸(代码结构)不会报错。
代码示例:
python
class FutureHouse: # 定义一个未来的房子类def living_room(self): # 计划在客厅放沙发pass # 占位,以后再实现具体功能def kitchen(self): # 计划设计厨房# 这里先写一些代码print("这是厨房的基本结构")pass # 占位,后续添加更多功能
3. 类的初始化方法(__init__
)
知识点解释:
__init__
是类的构造函数,在创建对象时自动调用,用于初始化对象的实例属性(每个对象独有的特征)。
比喻:
就像定制手机壳:
- 手机壳工厂(类)有一个标准化流程(
__init__
方法), - 顾客(创建对象时)可以选择图案、材质等个性化参数,
- 工厂根据这些参数生产出独一无二的手机壳(对象)。
代码示例:
python
class PhoneCase:def __init__(self, pattern, material): # 初始化方法,接收个性化参数self.pattern = pattern # 实例属性:图案self.material = material # 实例属性:材质def describe(self):print(f"这是一个{self.material}材质、印有{self.pattern}图案的手机壳。")# 创建两个不同的手机壳
case1 = PhoneCase("星空", "硅胶") # 自动调用__init__,传入参数
case2 = PhoneCase("猫咪", "塑料")case1.describe() # 输出:这是一个硅胶材质、印有星空图案的手机壳。
case2.describe() # 输出:这是一个塑料材质、印有猫咪图案的手机壳。
4. 类的普通方法
知识点解释:
类的方法是定义在类中的函数,用于描述对象的行为。方法的第一个参数通常是self
,指向调用该方法的对象本身。
比喻:
就像汽车的功能:
- 汽车(对象)有 “启动”“加速”“刹车” 等功能(方法),
- 每个功能都需要操作汽车自身的部件(访问对象的属性),
self
就像是汽车的 “方向盘”,让方法知道操作的是哪辆车。
代码示例:
python
class Car:def __init__(self, brand, color):self.brand = brandself.color = colorself.speed = 0 # 初始速度为0def start(self): # 普通方法:启动汽车print(f"{self.color}的{self.brand}启动了!")self.speed = 10 # 修改对象的属性def accelerate(self): # 普通方法:加速self.speed += 20print(f"加速!当前速度:{self.speed}km/h")my_car = Car("宝马", "白色")
my_car.start() # 输出:白色的宝马启动了!
my_car.accelerate() # 输出:加速!当前速度:30km/h
5. 类的继承:属性的继承、方法的继承
知识点解释:
继承是指一个类(子类)可以继承另一个类(父类)的属性和方法,从而复用代码并扩展功能。
比喻:
就像家族传承:
- 子女(子类)会继承父母(父类)的外貌特征(属性)和生活习惯(方法),
- 同时子女也可以发展自己独特的爱好(新增属性或方法),
- 甚至改进某些习惯(重写父类方法)。
代码示例:
python
# 父类:动物
class Animal:def __init__(self, name):self.name = namedef eat(self): # 父类方法print(f"{self.name}正在吃东西。")# 子类:狗(继承自Animal)
class Dog(Animal): # 括号内写父类名称def __init__(self, name, breed):super().__init__(name) # 调用父类的初始化方法self.breed = breed # 子类新增属性def bark(self): # 子类新增方法print(f"{self.name}({self.breed})在汪汪叫!")def eat(self): # 重写父类方法print(f"{self.name}({self.breed})正在狼吞虎咽地吃东西!")# 创建子类实例
dog = Dog("旺财", "金毛")
dog.eat() # 调用重写后的方法
dog.bark() # 调用子类新增的方法
总结
- 类的定义:像模具,定义对象的模板。
- pass 占位:像蓝图上的空白标记,暂时不实现功能。
- 初始化方法:像定制产品,创建对象时设置个性化属性。
- 普通方法:像汽车功能,描述对象能做什么。
- 继承:像家族传承,子类复用父类特性并发展自己的特性。
如果有任何地方没讲清楚,随时告诉我哦! 😊
代码:
import math# 题目1: 定义圆类
class Circle:def __init__(self, radius=1):self.radius = radiusdef calculate_area(self):return round(math.pi * self.radius ** 2, 2)def calculate_circumference(self):return round(2 * math.pi * self.radius, 2)# 题目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# 题目3: 图形工厂函数
def create_shape(shape_type, *args):if shape_type == "circle":return Circle(*args)elif shape_type == "rectangle":return Rectangle(*args)else:raise ValueError("不支持的图形类型")# 测试代码
if __name__ == "__main__":# 测试圆类circle = Circle(5)print(f"半径:{circle.radius}")print(f"面积:{circle.calculate_area()}")print(f"周长:{circle.calculate_circumference()}")# 测试长方形类rect = Rectangle(4, 6)print(f"\n长:{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"\n是否为正方形:{square.is_square()}")# 测试图形工厂shape1 = create_shape("circle", 5)print(f"\n圆周长:{shape1.calculate_circumference()}")shape2 = create_shape("rectangle", 3, 4)print(f"是否为正方形:{shape2.is_square()}")
输出: