Day 28:类的定义和方法

DAY 28 类的定义和方法

知识点学习

1. 类的定义

在Python中,类是创建对象的模板。使用class关键字来定义一个类。类名通常采用首字母大写的命名方式(PascalCase)。

python 复制代码
# 最简单的类定义
class MyClass:
    pass  # 使用pass占位符

类的定义就像是创建一个蓝图,比如要造汽车,类就是汽车的设计图纸,而具体的汽车对象就是根据这个图纸制造出来的实体车辆。

2. pass占位语句

pass是Python中的占位语句,当需要在语法上需要代码块,但暂时不想写具体内容时使用。它什么都不做,只是为了保证语法正确。

python 复制代码
class EmptyClass:
    pass  # 暂时没有具体内容,但语法完整

def empty_function():
    pass  # 函数体暂时为空

if True:
    pass  # 条件语句暂时为空

3. 类的初始化方法

__init__方法是类的构造方法,当创建类的实例时会自动调用。这就像是给新生儿起名字和登记基本信息的过程。

python 复制代码
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,代表调用该方法的实例。

python 复制代码
class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score
    
    def introduce(self):
        """自我介绍方法"""
        return f"我是{self.name},我的成绩是{self.score}分"
    
    def is_pass(self):
        """判断是否及格"""
        return self.score >= 60
    
    def add_score(self, points):
        """加分方法"""
        self.score += points
        print(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. 类的继承

继承是面向对象编程的重要特性,子类可以继承父类的属性和方法。这就像是孩子会遗传父母的某些特征一样。

属性的继承
python 复制代码
class Animal:
    def __init__(self, name, species):
        self.name = name
        self.species = species
        self.is_alive = True  # 所有动物都是活着的

class Dog(Animal):  # Dog继承Animal
    def __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}")  # 继承自父类的属性
方法的继承
python 复制代码
class Animal:
    def __init__(self, name):
        self.name = name
    
    def 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 = color
    
    def 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)类

思路分析:

需要创建一个圆类,它应该能够存储半径信息,并且能够计算面积和周长。圆的面积公式是πr²,周长公式是2πr。

python 复制代码
import math

class Circle:
    def __init__(self, radius=1):
        self.radius = radius
    
    def calculate_area(self):
        area = math.pi * self.radius ** 2
        return round(area, 2)
    
    def calculate_circumference(self):
        circumference = 2 * math.pi * self.radius
        return 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×(长+宽)),还要能判断是否为正方形(长==宽)。

python 复制代码
class Rectangle:
    def __init__(self, length=1, width=1):
        self.length = length
        self.width = width
    
    def calculate_area(self):
        return self.length * self.width
    
    def calculate_perimeter(self):
        return 2 * (self.length + self.width)
    
    def is_square(self):
        return self.length == self.width

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()}")         # 输出:是否为正方形:False

square = 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:图形工厂

思路分析:

工厂函数是一种设计模式,根据不同的参数创建不同类型的对象。需要创建一个函数,根据传入的图形类型参数来决定创建圆还是长方形对象。

python 复制代码
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.42

shape2 = 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}")

完整示例代码

python 复制代码
import math

# 圆类
class Circle:
    def __init__(self, radius=1):
        self.radius = radius
    
    def calculate_area(self):
        area = math.pi * self.radius ** 2
        return round(area, 2)
    
    def calculate_circumference(self):
        circumference = 2 * math.pi * self.radius
        return round(circumference, 2)

# 长方形类
class Rectangle:
    def __init__(self, length=1, width=1):
        self.length = length
        self.width = width
    
    def calculate_area(self):
        return self.length * self.width
    
    def 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()}")

@浙大疏锦行

相关推荐
寄思~15 分钟前
学习笔记:封装和单继承
开发语言·笔记·python·学习
E_ICEBLUE36 分钟前
Python 操作 Word 文档:主流库对比与选择指南
开发语言·经验分享·python·word·办公自动化
倔强青铜三36 分钟前
苦练Python第38天:input() 高级处理,安全与异常管理
人工智能·python·面试
大模型真好玩1 小时前
深入浅出LangChain AI Agent智能体开发教程(六)—两行代码LangChain Agent API快速搭建智能体
人工智能·python·agent
德育处主任Pro1 小时前
『React』 组件通信全攻略
python·opencv·matplotlib
七七软件开发2 小时前
一对一交友小程序 / APP 系统架构分析
java·python·小程序·系统架构·php
电商数据girl2 小时前
如何利用API接口与网页爬虫协同进行电商平台商品数据采集?
大数据·开发语言·人工智能·python·django·json
万粉变现经纪人2 小时前
如何解决pip安装报错ModuleNotFoundError: No module named ‘dash’问题
python·scrapy·pycharm·flask·pip·策略模式·dash
Monkey的自我迭代2 小时前
逻辑回归参数调优实战指南
python·机器学习·逻辑回归·数据处理·下采样·过采样
一念&2 小时前
计算机网络中的socket是什么?编程语言中的socket编程又是什么?python的socket编程又该如何用?
python·计算机网络·php