一、为什么需要类?

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()

运行结果展示

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐