当前位置: 首页 > news >正文

DAY 28 类的定义和方法-2025.9.15

类的定义和方法

知识点回顾

  1. 类的定义
  2. pass占位语句
  3. 类的初始化方法
  4. 类的普通方法
  5. 类的继承:属性的继承、方法的继承
    在这里插入图片描述

作业

题目1:定义圆(Circle)类

要求:

  1. 包含属性:半径 radius。
  2. 包含方法:
  • calculate_area():计算圆的面积(公式:πr²)。
  • calculate_circumference():计算圆的周长(公式:2πr)。
  1. 初始化时需传入半径,默认值为 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)类

  1. 包含属性:长 length、宽 width。
  2. 包含方法:
  • calculate_area():计算面积(公式:长×宽)。
  • calculate_perimeter():计算周长(公式:2×(长+宽))。 is_square() 方法,判断是否为正方形(长 == 宽)。
  1. 初始化时需传入长和宽,默认值均为 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. 类的定义:创建对象的 “模板”

类通过class关键字定义,语法如下:

class 类名:# 类的属性(数据)和方法(函数)

示例:定义一个描述 “人” 的类

class Person:# 类的属性和方法将在这里定义pass  # 暂时用pass占位,后面会补充内容
  • 类名通常使用 “驼峰命名法”(首字母大写,如PersonStudent),区分于函数的小写加下划线命名。
  • 类是 “模板”,本身不占用内存;基于类创建的 “对象”(实例)才是具体的个体,比如Person类可以创建AliceBob等对象。

2. pass 占位语句:“先占个位置”

pass是 Python 中的空语句,用于 “语法上需要代码块但暂时没有具体实现” 的场景(比如类、函数、条件判断中),作用是避免语法错误。

示例

class EmptyClass:pass  # 这个类暂时没有任何内容,但定义是合法的def empty_func():pass  # 这个函数暂时没有实现,不会报错

在类的定义中,当我们还没想好具体属性和方法时,用pass可以先完成类的框架搭建。

3. 类的初始化方法:创建对象时 “初始化属性”

初始化方法是类中特殊的方法,名为__init__(前后各两个下划线),作用是在创建对象时自动执行,为对象初始化属性。

基本语法

class 类名:def __init__(self, 参数1, 参数2, ...):# 初始化属性:self.属性名 = 参数self.属性1 = 参数1self.属性2 = 参数2
  • self是必须的第一个参数,代表 “当前创建的对象本身”(类似 “我自己”),通过self.属性名可以给对象绑定属性。
  • 创建对象时,传递的参数会自动传给__init__方法(无需手动传self)。

示例:给Person类添加初始化方法,绑定 “姓名” 和 “年龄” 属性

class Person:# 初始化方法:创建对象时自动调用,初始化name和age属性def __init__(self, name, age):self.name = name  # 给对象绑定name属性self.age = age    # 给对象绑定age属性# 基于Person类创建对象(实例)
alice = Person("Alice", 30)  # 传递参数给__init__,self自动绑定到alice
bob = Person("Bob", 25)# 访问对象的属性
print(alice.name)  # 输出:Alice
print(bob.age)     # 输出:25

创建alice对象时,__init__自动执行,将"Alice"赋值给alice.name30赋值给alice.age

4. 类的普通方法:对象的 “行为”

普通方法是定义在类中的函数,用于描述对象的行为(比如 “说话”“计算” 等)。普通方法必须包含self作为第一个参数,通过self可以访问对象的属性或其他方法。

基本语法

class 类名:def 方法名(self, 参数1, ...):# 方法逻辑(可以通过self访问属性)...

示例:给Person类添加greet(打招呼)和get_birth_year(计算出生年份)方法

class Person:def __init__(self, name, age):self.name = nameself.age = age# 普通方法:打招呼def greet(self):# 通过self访问name属性return f"Hello, I'm {self.name}!"# 普通方法:计算出生年份def get_birth_year(self):return 2025 - self.age# 创建对象并调用方法
alice = Person("Alice", 30)
print(alice.greet())  # 输出:Hello, I'm Alice!
print(alice.get_birth_year())  # 输出:1995(2025-30)
  • 调用方法时,无需传递self参数(Python 会自动将对象本身传给self)。
  • 方法中可以通过self.属性名访问对象的属性,也可以通过self.其他方法名()调用类中的其他方法。

5. 类的继承:“子承父业” 减少重复代码

继承是面向对象的核心特性之一,允许子类(派生类)继承父类(基类)的属性和方法,从而减少代码重复。子类可以在父类基础上添加新属性 / 方法,或修改父类的方法(称为 “重写”)。

(1)基本语法:定义子类继承父类
class 父类名:# 父类的属性和方法class 子类名(父类名):  # 括号中指定父类# 子类可以添加新属性/方法,或重写父类方法
(2)属性的继承

子类会自动继承父类的属性,但若子类有自己的__init__方法,需要通过super()手动调用父类的__init__,否则父类的属性不会被初始化。

示例Student类继承Person类,新增 “学号” 属性

class Person:  # 父类def __init__(self, name, age):self.name = nameself.age = ageclass Student(Person):  # 子类继承Persondef __init__(self, name, age, student_id):# 调用父类的__init__方法,继承name和age属性super().__init__(name, age)  # super()代表父类# 新增子类自己的属性self.student_id = student_id# 创建Student对象
stu = Student("Charlie", 20, "2025001")# 访问继承的属性(来自Person)
print(stu.name)  # 输出:Charlie
print(stu.age)   # 输出:20# 访问子类新增的属性
print(stu.student_id)  # 输出:2025001
  • super().__init__(name, age)确保父类的nameage属性被正确初始化,否则子类对象会缺少这些属性。
(3)方法的继承与重写

子类会自动继承父类的方法,也可以重写父类的方法(定义与父类同名的方法),实现子类特有的逻辑。

示例Student类继承Persongreet方法,并新增study方法,同时重写get_birth_year方法

class Person:def __init__(self, name, age):self.name = nameself.age = agedef greet(self):return f"Hello, I'm {self.name}!"def get_birth_year(self):return 2025 - self.age  # 父类的实现class Student(Person):def __init__(self, name, age, student_id):super().__init__(name, age)self.student_id = student_id# 新增子类自己的方法def study(self, course):return f"{self.name} is studying {course}."# 重写父类的get_birth_year方法(假设学生年龄计算方式不同)def get_birth_year(self):# 子类特有的逻辑:比实际年龄小1岁(举例)return 2025 - (self.age - 1)# 测试继承和重写
stu = Student("Charlie", 20, "2025001")# 继承父类的greet方法
print(stu.greet())  # 输出:Hello, I'm Charlie!# 调用子类新增的study方法
print(stu.study("Math"))  # 输出:Charlie is studying Math.# 调用重写后的get_birth_year(使用子类逻辑)
print(stu.get_birth_year())  # 输出:2006(2025 - (20-1) = 2025-19=2006)# 父类的方法不受影响
person = Person("David", 40)
print(person.get_birth_year())  # 输出:1983(父类原逻辑)
  • 继承Student自动获得Persongreet方法,无需重新定义。
  • 重写Studentget_birth_year与父类同名,调用时会执行子类的逻辑,实现了 “子类特有的行为”。

总结

  1. ** 类的定义 :class关键字创建,是对象的模板
  2. pass 语句 :临时占位,避免语法错误
  3. 初始化方法__init__创建对象时自动执行,用于初始化属性,必须包含self
  4. 普通方法 :描述对象的行为,第一个参数为self,可访问对象属性
  5. 继承 **:子类通过class 子类(父类)继承父类的属性和方法:
  • 属性继承:需用super().__init__调用父类初始化方法。
  • 方法继承与重写:子类可直接使用父类方法,或重写方法实现自定义逻辑。

类和继承是面向对象编程的核心,能大幅提高代码的复用性和可维护性,在机器学习中(如定义模型类、数据处理类)应用广泛。

作业

题目1:定义圆(Circle)类

要求

  1. 包含属性:半径 radius。
  2. 包含方法:
  • calculate_area():计算圆的面积(公式:πr²)。
  • calculate_circumference():计算圆的周长(公式:2πr)。
  1. 初始化时需传入半径,默认值为 1。
# 示例运行
circle = Circle(5)
print(f"半径:{circle.radius}")       # 输出:半径:5
print(f"面积:{circle.calculate_area()}")   # 输出:面积:78.54(保留两位小数)
print(f"周长:{circle.calculate_circumference()}") # 输出:周长:31.42(保留两位小数)

解答

import math
class Circle:  ## 定义类def __init__(self, radius=1):  ## 初始化属性self.radius = radiusdef calculate_area(self):  ## 方法1 : 计算圆的面积area = math.pi * self.radius ** 2return areadef calculate_circumference(self):  ## 方法2 :计算圆的周长circumference = 2 * math.pi * self.radiusreturn circumferencecircle = Circle(5)
print(f"半径:{circle.radius}")       
print(f"面积:{circle.calculate_area():.2f}")   
print(f"周长:{circle.calculate_circumference():.2f}")

半径:5
面积:78.54
周长:31.42


题目2:定义长方形(Rectangle)类

  1. 包含属性:长 length、宽 width。
  2. 包含方法:
  • calculate_area():计算面积(公式:长×宽)。
  • calculate_perimeter():计算周长(公式:2×(长+宽))。
  • is_square() 方法,判断是否为正方形(长 == 宽)。
  1. 初始化时需传入长和宽,默认值均为 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

解答

class Rectangle:  ## 定义类def __init__(self, length=1, width=1): ## 初始化属性self.length = lengthself.width = widthdef calculate_area(self):  ## 方法1 : 计算面积area = self.length * self.widthreturn areadef calculate_perimeter(self):  ## 方法2 : 计算周长perimeter = 2 * (self.length + self.width)return perimeterdef is_square(self):  ## 方法3 : 判断是否为正方形if self.length == self.width:return Trueelse:return Falserect = 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()}")  r = Rectangle()
print(f"长:{r.length}, 宽:{r.width}")  
print(f"面积:{r.calculate_area()}")      
print(f"周长:{r.calculate_perimeter()}")  
print(f"是否为正方形:{r.is_square()}")  

长:4, 宽:6
面积:24
周长:20
是否为正方形:False
是否为正方形:True
长:1, 宽:1
面积:1
周长:4
是否为正方形: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

解答

def create_shape(shape_type, *args):"""根据类型和参数创建图形对象参数:shape_type: 图形类型,"circle"表示圆,"rectangle"表示长方形*args: 图形参数,圆需要1个参数(半径),长方形需要2个参数(长、宽)返回:对应的图形对象,如果类型或参数无效则返回None"""try:if shape_type == "circle":# 检查圆的参数数量if len(args) > 1:raise ValueError("创建圆只需要1个半径参数")# 若未提供参数,使用默认值1radius = args[0] if args else 1return Circle(radius)elif shape_type == "rectangle":# 检查长方形的参数数量if len(args) > 2:raise ValueError("创建长方形只需要2个参数(长、宽)")# 若未提供或只提供部分参数,使用默认值1length = args[0] if len(args) >= 1 else 1width = args[1] if len(args) >= 2 else 1return Rectangle(length, width)else:raise ValueError(f"不支持的图形类型: {shape_type},仅支持'circle'和'rectangle'")except ValueError as e:print(f"创建图形失败: {e}")return Noneshape1 = create_shape("circle", 5)
print(f'{shape1.calculate_circumference():.2f}')  shape2 = create_shape("rectangle", 3, 4)
print(shape2.is_square())                

31.42
False

@浙大疏锦行


文章转载自:

http://3PSkmN6X.mLcnh.cn
http://97C3Izg2.mLcnh.cn
http://q7x0cjsD.mLcnh.cn
http://FxdSIraD.mLcnh.cn
http://gmG8E1ha.mLcnh.cn
http://6HFpG2Y8.mLcnh.cn
http://KmAgH95N.mLcnh.cn
http://rBv8pOgo.mLcnh.cn
http://BL277LB7.mLcnh.cn
http://QWUVO9x6.mLcnh.cn
http://AyH1egxf.mLcnh.cn
http://NREXKr9B.mLcnh.cn
http://XnCAHEpu.mLcnh.cn
http://hSvPgGlT.mLcnh.cn
http://YKaMby1J.mLcnh.cn
http://zRDkRKFR.mLcnh.cn
http://NYCDi4Js.mLcnh.cn
http://RDsWIBpO.mLcnh.cn
http://NcH7hv05.mLcnh.cn
http://v5thYuNM.mLcnh.cn
http://CI8yI9sg.mLcnh.cn
http://JY6rGBGd.mLcnh.cn
http://PinY5Lnv.mLcnh.cn
http://GwQVeYfB.mLcnh.cn
http://kjiTUSP7.mLcnh.cn
http://ldl9K0K1.mLcnh.cn
http://dhB40BZy.mLcnh.cn
http://fslSXtlt.mLcnh.cn
http://KRYJcEAj.mLcnh.cn
http://Sz540syu.mLcnh.cn
http://www.dtcms.com/a/381413.html

相关文章:

  • Linux信号小细节整理
  • Django全栈班v1.04 Python基础语法 20250913 下午
  • 第38次CCFCSP第三题--消息解码
  • 新零售第一阶段传统零售商的困境突破与二次增长路径:基于定制开发开源AI智能名片S2B2C商城小程序的实践探索
  • 金融科技:香港中小型企业(SME)市场规模、零售银行细分、家族办公室、私人银行、商业银行、渠道管理
  • 08_多层感知机
  • mysql基础——库与表的操作
  • Kafka系列之:Kafka broker does not support the ‘MetadataRequest_v0‘ Kafka protocol.
  • 06-Redis 基础配置与多数据库:从端口修改到数据隔离
  • Android真机-安装Reqable证书-抓SSL包
  • 贪心算法应用:决策树(ID3/C4.5)详解
  • 创建数据库索引时,要考虑一下这5个维度
  • 如何用 Rust 重写 SQLite 数据库?
  • Eureka挂了对整个服务的影响
  • 简单设计-小红书封面制作工具,小红书图文生成器
  • ​​Docker 容器化部署核心实战:从镜像仓库管理、容器多参数运行到 Nginx 服务配置与正反向代理原理解析​
  • 【目标检测】metrice_curve和loss_curve对比图可视化
  • 文件上传漏洞知识+21关文件上传漏洞教程
  • AS32S601在轨重构(OTA)方案的优化与分析
  • 《Unity项目实战:动态加载引发的显存危机全链路排查与重构实践》
  • 【办公类-109-04】20250913圆牌卡片(接送卡被子卡床卡入园卡_word编辑单面)
  • 档案管理系统
  • 《C++进阶之STL》【哈希表】
  • 阿里云百炼平台使用避坑记录
  • 权限管理混乱如何影响知识获取
  • Linux 开发工具(1)
  • 多级缓存架构实战手册:Caffeine+Redis 从设计到落地的全链路解决方案
  • springboot 二手物品交易系统设计与实现
  • 【秋招笔试】2025.09.13滴滴秋招第一套笔试真题
  • leetcode151:反转字符串中的单词(正则化预处理与双指针原地解法)