Python核心语法——面向对象基础
一、编程范式概览
1.1 面向过程编程
核心思想:把一个需求分解成一系列要执行的步骤,然后按照步骤依次执行这些任务(关注的是流程、步骤)。
适用场景:面向过程编程非常直接,适合简单、线性的任务。
1.2 面向对象编程
对象可以理解为现实中具体的人/物在程序中的数字化身(万物皆对象)。它把一个人/物的特征和功能打包到一起,是面向对象编程的基本单元(关注的是谁来帮我做这件事儿)。
属性:对象的状态(数据)
方法:对象的行为(功能)
类:描述的是一组具有相同属性(特征)和方法(功能/行为)的模板。
对象:对象是类的实例,是基于类创建出来的(实例对象)。
二、类与对象
2.1 类的定义
定义类的语法如下(推荐使用大驼峰命名法,如UserInfo、UserAccount):
class ClassName: def __init__(self, 参数列表): # 初始化属性 self.属性名 = 参数__init__:初始化方法,对象创建后自动调用,主要用于设置对象的初始状态(设置对象属性)。self:方法的第一个参数,表示当前创建的实例对象,方法调用时无需手动传递。
示例:
class Student: def __init__(self, name, chinese, math, english): self.name = name self.chinese = chinese self.math = math self.english = english2.2 对象的创建
通过类名加括号即可创建实例对象,传入__init__所需的参数:
stu = Student("张三", 90, 85, 88)说明:__dict__是Python中用户自定义类实例的一个特殊属性,用于以字典形式存储对象的属性 。
三、实例方法
在类中定义实例方法时,定义语法与之前学习的函数定义的方式一致。self表示当前实例对象,调用时无需传递。
class Student: def __init__(self, name, chinese, math, english): self.name = name self.chinese = chinese self.math = math self.english = english def get_average(self): return (self.chinese + self.math + self.english) / 3 # 使用 stu = Student("李四", 80, 90, 95) print(stu.get_average()) # 88.333...四、魔法方法
4.1 什么是魔法方法
魔法方法是指 Python 中提供的以双下划线开头和结尾的特殊方法,用于定义类的特殊行为,比如__init__。魔法方法是不需要我们手动调用的,Python 会在合适的时机自动调用。
默认行为(未重写时):
__str__:默认输出对象的内存地址(16进制)__eq__:默认基于对象的内存地址进行比较比较运算符(
<、<=、>、>=)默认自定义对象之间不可以进行大小比较
4.2 常用的魔法方法
| 魔法方法 | 触发时机 |
|---|---|
__init__ | 对象创建后初始化 |
__str__ | 使用print()或str()时 |
__eq__ | 使用==比较时 |
__lt__ | 使用<比较时 |
__le__ | 使用<=比较时 |
__gt__ | 使用>比较时 |
__ge__ | 使用>=比较时 |
示例:
class Student: def __init__(self, name, score): self.name = name self.score = score def __str__(self): return f"Student(name={self.name}, score={self.score})" def __eq__(self, other): return self.score == other.score def __lt__(self, other): return self.score < other.score五、实例属性与类属性
属性分为两类:
实例属性:属于每个具体对象的属性,每个对象都是独立的(各个对象特有的数据)。通过
实例对象.属性方式操作。类属性:属于类本身的属性,所有实例共享的(所有对象共享的数据或配置)。通过
类名.属性方式操作。
示例:
class Student: school = "北京大学" # 类属性 def __init__(self, name, score): self.name = name # 实例属性 self.score = score # 实例属性 # 访问类属性 print(Student.school) # 北京大学 # 访问实例属性 s1 = Student("小明", 95) s2 = Student("小红", 88) print(s1.name) # 小明 print(s2.name) # 小红六、案例实战
6.1 教务管理系统(成绩管理)
需求:采用面向对象的编程思想,完成教务管理系统的开发。教务管理系统可以管理在校学生的成绩信息,通过控制台菜单与用户交互,具体的功能如下:
添加学生成绩:根据输入的学生姓名、语文成绩、数学成绩、英语成绩,记录在系统中
修改学生成绩:根据输入的学生姓名,修改对应的学生成绩
删除学生成绩:根据输入的学生姓名,删除对应的学生成绩
查询指定学生成绩:根据输入的学生姓名,查找对应的学生成绩,并输出
展示全部学生成绩:展示出系统中所有学生的成绩
实现代码:
class Student: """学生类,存储单个学生的成绩信息""" def __init__(self, name, chinese, math, english): self.name = name self.chinese = chinese self.math = math self.english = english def __str__(self): return f"姓名: {self.name}, 语文: {self.chinese}, 数学: {self.math}, 英语: {self.english}" class EduManagement: """教务管理系统,管理所有学生""" def __init__(self): self.students = [] # 存储学生对象的列表 def add_student(self, name, chinese, math, english): """添加学生成绩""" # 检查是否已存在同名学生 for stu in self.students: if stu.name == name: print("该学生已存在,请勿重复添加。") return False student = Student(name, chinese, math, english) self.students.append(student) print(f"学生 {name} 的成绩添加成功!") return True def modify_student(self, name, chinese, math, english): """修改学生成绩""" for stu in self.students: if stu.name == name: stu.chinese = chinese stu.math = math stu.english = english print(f"学生 {name} 的成绩修改成功!") return True print(f"未找到名为 {name} 的学生。") return False def delete_student(self, name): """删除学生成绩""" for i, stu in enumerate(self.students): if stu.name == name: del self.students[i] print(f"学生 {name} 的成绩删除成功!") return True print(f"未找到名为 {name} 的学生。") return False def query_student(self, name): """查询指定学生成绩""" for stu in self.students: if stu.name == name: print(stu) return stu print(f"未找到名为 {name} 的学生。") return None def show_all(self): """展示全部学生成绩""" if not self.students: print("当前系统中没有学生成绩记录。") return print("===== 全部学生成绩 =====") for stu in self.students: print(stu) print("=======================") def main(): system = EduManagement() while True: print("\n===== 教务管理系统 =====") print("1. 添加学生成绩") print("2. 修改学生成绩") print("3. 删除学生成绩") print("4. 查询指定学生成绩") print("5. 展示全部学生成绩") print("0. 退出系统") choice = input("请选择操作(0-5):") if choice == "0": print("感谢使用,再见!") break elif choice == "1": name = input("请输入学生姓名:") chinese = float(input("请输入语文成绩:")) math = float(input("请输入数学成绩:")) english = float(input("请输入英语成绩:")) system.add_student(name, chinese, math, english) elif choice == "2": name = input("请输入要修改的学生姓名:") chinese = float(input("请输入新的语文成绩:")) math = float(input("请输入新的数学成绩:")) english = float(input("请输入新的英语成绩:")) system.modify_student(name, chinese, math, english) elif choice == "3": name = input("请输入要删除的学生姓名:") system.delete_student(name) elif choice == "4": name = input("请输入要查询的学生姓名:") system.query_student(name) elif choice == "5": system.show_all() else: print("无效选择,请重新输入。") if __name__ == "__main__": main()6.2 购物车管理系统
需求:采用面向对象的编程思想,开发一个购物车管理系统,实现商品信息的添加、修改、删除、查询功能。系统使用自定义对象存储商品数据,通过控制台菜单与用户交互。具体功能如下:
添加购物车:用户根据提示录入商品名称、以及该商品的价格、数量,保存该商品信息到购物车。
修改购物车:要求用户输入要修改的购物车商品名称,然后再提示输入该商品的价格、数量,输入完成后修改该商品信息。
删除购物车:要求用户输入要删除的购物车名称,根据名称删除购物车中的商品。
查询购物车:将购物车中的商品信息展示出来,格式为:"商品名称: xxx, 商品价格: xxx, 商品数量: xxx"。
退出购物车
实现代码:
class Goods: """商品类,代表购物车中的单个商品""" def __init__(self, name, price, quantity): self.name = name self.price = price self.quantity = quantity def __str__(self): return f"商品名称: {self.name}, 商品价格: {self.price}, 商品数量: {self.quantity}" class ShoppingCart: """购物车系统,管理商品列表""" def __init__(self): self.cart = [] # 存储 Goods 对象的列表 def add_goods(self, name, price, quantity): """添加商品到购物车""" # 若已存在同名商品,提示并返回 for goods in self.cart: if goods.name == name: print("购物车中已有该商品,如需修改请使用修改功能。") return False new_goods = Goods(name, price, quantity) self.cart.append(new_goods) print(f"商品 {name} 已添加到购物车。") return True def modify_goods(self, name, price, quantity): """修改购物车中的商品信息""" for goods in self.cart: if goods.name == name: goods.price = price goods.quantity = quantity print(f"商品 {name} 的信息已更新。") return True print(f"未找到名为 {name} 的商品。") return False def delete_goods(self, name): """从购物车删除商品""" for i, goods in enumerate(self.cart): if goods.name == name: del self.cart[i] print(f"商品 {name} 已从购物车删除。") return True print(f"未找到名为 {name} 的商品。") return False def show_cart(self): """展示购物车所有商品""" if not self.cart: print("购物车为空。") return print("===== 购物车商品列表 =====") for goods in self.cart: print(goods) print("==========================") def main(): cart = ShoppingCart() while True: print("\n===== 购物车管理系统 =====") print("1. 添加商品") print("2. 修改商品") print("3. 删除商品") print("4. 查询购物车(展示全部)") print("0. 退出购物车") choice = input("请选择操作(0-4):") if choice == "0": print("退出购物车,欢迎下次光临!") break elif choice == "1": name = input("请输入商品名称:") price = float(input("请输入商品价格:")) quantity = int(input("请输入商品数量:")) cart.add_goods(name, price, quantity) elif choice == "2": name = input("请输入要修改的商品名称:") price = float(input("请输入新的商品价格:")) quantity = int(input("请输入新的商品数量:")) cart.modify_goods(name, price, quantity) elif choice == "3": name = input("请输入要删除的商品名称:") cart.delete_goods(name) elif choice == "4": cart.show_cart() else: print("无效选择,请重新输入。") if __name__ == "__main__": main()七、异常处理
7.1 什么是异常
异常(也称为 Bug)就是程序运行过程中出现的错误,它会中断程序的正常执行流程。
常见异常类型:
NameErrorTypeErrorIndexErrorKeyErrorValueError
异常不是坏东西,而是编写健壮程序的重要工具。其作用:
保证数据、逻辑的正确性,避免程序执行混乱
在开发阶段,尽量发现更多的问题,尽早解决问题,保障程序正常执行
7.2 异常处理语法
程序运行过程中出现异常,有两种处理方案:
不做处理:整个程序因为一个 Bug,中断执行。
捕获异常:按照我们自己的处理方式,处理完异常,程序继续执行。
捕获异常的语法(finally可有可无):
try: # 可能出错的代码 except 异常类型 as e: # 处理异常的代码 finally: # 无论是否发生异常都会执行的代码(可选)示例:
try: num = int(input("请输入一个数字:")) result = 10 / num print(f"结果是:{result}") except ValueError: print("输入无效,请输入一个数字。") except ZeroDivisionError: print("除数不能为0。") except Exception as e: print(f"发生了未知异常:{e}") finally: print("程序执行完毕。")7.3 异常的传递
异常传递就是异常在函数调用中层层上报的过程,直到有人处理它,或者程序崩溃。
def fun3(): print(my_color) # NameError,my_color 未定义 def fun2(): fun3() def fun1(): fun2() if __name__ == "__main__": try: fun1() except NameError as e: print(f"捕获到异常:{e}")当fun3中发生异常时,它会向上传递到fun2→fun1→ 主程序,如果主程序有try...except则捕获处理,否则程序崩溃。
八、总结
面向对象编程(OOP)是 Python 的核心范式之一,通过类与对象将数据和行为封装在一起,提高了代码的复用性、可维护性和扩展性。掌握以下关键点即可快速上手:
类与对象:类是模板,对象是实例
实例方法:操作对象数据的行为,
self指代当前实例魔法方法:自动触发的特殊方法,如
__init__、__str__属性分类:实例属性(对象独有)与类属性(共享)
异常处理:使用
try...except提供预案,避免程序意外崩溃
