【Python类的基础知识】快递机器人程序(附完整代码)
一、为什么需要类?
1. 解决多函数间的数据共享问题
在实际编程中,多个函数经常需要共享同一份数据。如果使用全局变量,随着代码规模扩大,容易导致命名冲突、数据被意外修改等问题,代码结构变得混乱。
类的优势:
· 将数据与操作数据的函数封装在一起
· 通过self参数集中管理共享数据
· 避免全局变量污染,提升代码可维护性
例如,微信的“扫一扫”和“朋友圈”功能都需要共享用户的登录信息。使用类可以将这些数据存储在self中,供所有方法调用。
二、类的基本概念
1. 什么是类?
类是描述具有相同属性和方法的对象集合。简单来说,类是创建对象的模板或蓝图。
· Python内置的list、dict等都属于类
· 具体实例如a = [1, 2, 3]是由类生成的对象
2. 类的组成
一个类通常包含:
· 属性:描述对象的状态(如微波炉的名称、购买时间)
· 方法:定义对象的行为(如微波炉的加热功能)
三、创建和使用类
1. 基本语法
使用class关键字创建类,类名建议使用大驼峰命名法(Microwave)。
import time
class Microwave:
"""实现微波炉基础功能的类"""
def __init__(self, name):
self.name = name
self.purchase_date = time.strftime("%Y-%m-%d") # 记录购买日期
def display_info(self):
"""打印设备信息"""
print(f"设备名称: {self.name}, 购买日期: {self.purchase_date}")
def set_temperature(self, temperature):
"""设置加热温度"""
self.temperature = temperature # 存储温度参数
2. 核心方法
__init__是类的构造方法,在实例化对象时自动调用,用于初始化对象的属性,将数据存入self空间self本质上是类的共享数据存储空间,所有方法的第一个参数都必须是self,以便访问共享数据
3. 创建对象
# 实例化微波炉对象
a = Microwave("张三的微波炉")
# 调用对象方法
a.print_info() # 输出:微波炉名称: 张三的微波炉, 购买时间: 2025-01-15
a.bright(80) # 设置温度为80度
print(a.temper) # 输出当前温度:80
执行流程:
1. a = Microwave("张三的微波炉") → 参数"张三的微波炉"传递给__init__的name
2. self.name = name → 将值存入当前对象的self空间
3. a.print_info() → 从self读取name和time并打印
4. a.bright(80) → 将80存入self.temper
4. 易错点提醒
未初始化属性直接访问会报错:如果未调用bright方法就直接访问a.temper,会引发AttributeError
实例化只执行`init:其他方法需要显式调用才会执行
四、类的属性操作
1. 获取属性值
print(a.name) # 输出结果:张三的微波炉
2. 修改属性值
可以直接赋值修改:
a.name = "李四的微波炉"
print(a.name) # 输出结果:李四的微波炉
3. 获取类的文档说明
使用__doc__属性:
print(Microwave.__doc__) # 显示"微波炉功能类"的文档字符串
__doc__是类的内置属性,类似于产品说明书,用于描述类的功能。
五、类的继承
1. 为什么需要继承?
当我们需要在现有类基础上扩展新功能,但希望保留原类不变时,可以使用继承。例如,企业微信在微信基础上增加了考勤、审批等功能,这就是继承的典型应用。继承可以减少重复编码,提升代码复用性,构建清晰的层级关系
2. 继承的基本语法
# 父类(基类定义)
class WeChat:
def __init__(self, user):
self.user = user
def send_msg(self, msg):
print(f"{self.user} 发送消息: {msg}")
# 子类(派生类定义)
class WorkWeChat(WeChat):
def __init__(self, user, company):
super().__init__(user) # 继承父类初始化
self.company = company
def attendance(self):
print(f"{self.user} 在 {self.company} 打卡")
关键点:
· class 子类名(父类名) 语法实现继承
· 必须使用 super().__init__() 初始化父类
· 父类所需的参数必须在子类初始化时传递
3. 方法覆盖
当子类定义了与父类同名的方法时,子类对象会优先调用子类的方法(即覆盖父类方法)。
class WorkWeChat(WeChat):
def send_msg(self, msg): # 覆盖父类方法
print(f"【企业微信】{self.user} 发送消息: {msg}")
4. 调用权限总结
| 对象类型 | 可调用方法 |
|---|---|
| 父类创建的对象 | 仅父类方法 |
| 子类创建的对象 | 父类方法 + 子类方法(同名方法优先调用子类实现) |
六、导入其他文件中的类
1. 基本导入方式
假设有一个microwave.py文件包含Microwave类:
# 方法一:导入整个模块
import microwave
m = microwave.Microwave("测试")
# 方法二:从模块导入特定类
from microwave import Microwave
m = Microwave("测试")
2. 在类中使用另一个类
from microwave import Microwave
class Kitchen:
def __init__(self, microwave_name):
self.microwave = Microwave(microwave_name)
def start_cooking(self):
self.microwave.set_brightness(100)
print("开始烹饪...")
3. 模块化
在开发大型项目或第三方库时,通过__init__.py将多个类文件组织成一个包:
# __init__.py
from .microwave import Microwave
from .wechat import WeChat
__all__ = ['Microwave','WeChat']
使用者只需导入顶层模块即可访问所有子模块功能:
from mykitchen import Microwave, WeChat
七、快递机器人程序
项目背景
某公司需要设计一个快递机器人程序,用于帮助用户完成寄件和取件操作。机器人需要具备以下能力:
· 记录用户的寄件信息(地址、手机号、姓名)
· 根据目的地自动计算邮费
· 自动生成唯一的寄件单号
· 管理货架上的快递,支持扫码取件
项目实现代码
class Robot():
def __init__(self):
print('我是您的快递小助手')
self.bill=20230100
self.postage={'北京':15,'上海':12,'广东':13}
self.q_number=[100,101,104,105]
def send_ex(self):
print('请填写您的寄件信息')
self.addr=input('您的寄件地址')
self.number=input('您的手机号码')
self.name=input('您的姓名')
print('您需要支付',self.postage[self.addr[0:2]],'元')
self.bill+=1
print('账单生成中...\n您的寄件单号:',self.bill)
def collect_ex(self):
self.c_list=int(input('请输入您的取件号:'))
if self.c_list in self.q_number:
print("您的快递已找到,请扫码领取。")
self.q_number.pop()
else:
print('未找到您的快递')
a=Robot()
a.send_ex()
运行结果展示

更多推荐

所有评论(0)