Python面向对象编程基础
Python面向对象编程基础
Python面向对象编程基础,包括面向过程与面向对象对比、类与对象、类的定义、实例方法、魔法方法、实例属性与类属性
面向过程编程
核心思想:把一个需求分解成一系列要执行的步骤,然后按照步骤依次执行这些任务(关注的是流程、步骤)。
适用场景:面向过程编程非常直接,适合简单、线性的任务。
示例:建筑施工流程
平整地基 → 地基打桩 → 地基浇筑 → 主体施工 → 砌墙施工 → 外墙施工 → 室内硬装 → 室内软装面向对象编程
对象可以理解为现实中具体的人/物在程序中的数字化身(万物皆对象)。
它把一个人/物的特征和功能打包到一起,是面向对象编程的基本单元(关注的是谁来帮我做这件事儿)。
- 特征 = 属性
- 功能 = 方法
示例
| 对象 | 属性 | 方法 |
|---|---|---|
| 挖掘机 | 颜色、油耗、马力 | 推平、挖掘 |
| 混凝土车 | 容量、颜色、臂长 | 搅拌、运输、浇筑 |
| 工人 | 工种、年龄、工服颜色、技能 | 打桩、砌墙、浇筑、装修 |
| 建材 | 类型、数量、价格、材质 | 存储、运输、焊接、铺贴 |
类与对象
类:描述的是一组具有相同属性(特征)和方法(功能/行为)的模板。
对象:对象是类的实例,是基于类创建出来的(实例对象)。
示例
- 类:月饼模具(属性:颜色、形状、大小、厚度;功能:提供能量、文化传承)
- 对象:用模具制作出来的月饼(每个月饼颜色可能不同)
提示:对象是由类创建出来的,创建对象的过程,也称为对象的实例化。一个类可以创建无数个对象。
目录
- 类与对象
- 实例方法
- 魔法方法
- 实例属性与类属性
- 案例
类的定义
语法格式
# 定义类class 类名: pass方式1:动态添加属性(不推荐)
# 定义类class Car: pass
# 创建对象c1 = Car()c1.brand = "BMW"c1.name = "X5"c1.price = 500000print(c1.__dict__) # {'brand': 'BMW', 'name': 'X5', 'price': 500000}方式2:定义类时指定实例属性(推荐)
# 定义类class Car: def __init__(self, c_brand, c_name, c_price): self.brand = c_brand self.name = c_name self.price = c_price
# 创建对象c1 = Car("BMW", "X5", 500000)print(c1.__dict__) # {'brand': 'BMW', 'name': 'X5', 'price': 500000}重要概念
self:方法的第一个参数,表示当前创建的实例对象__init__:初始化方法,对象创建后自动调用,主要用于设置对象的初始状态(设置对象属性)
说明:定义在类的外面的称之为函数,定义在类中的函数称之为方法
完整示例
# 定义类class Car: def __init__(self, c_color, c_brand, c_name, c_price): self.color = c_color self.brand = c_brand self.name = c_name self.price = c_price print("Car 类型的对象初始化完毕,对象属性已经添加完毕.")
# 创建对象c1 = Car(c_color="红色", c_brand="BMW", c_name="X7", c_price=800000)print(c1.__dict__)
c2 = Car(c_color="白色", c_brand="奔驰", c_name="E300", c_price=450000)print(c2.__dict__)类的定义小结
-
定义类时,类名的命名规范?
- 大驼峰命名法,如
UserInfo、UserAccount
- 大驼峰命名法,如
-
定义类时,
__init__方法的作用?self参数的作用?__init__是初始化方式,对象创建时自动调用,主要用于设置对象的初始状态(设置对象属性)self是类中定义的方法的第一个参数,表示当前创建的实例对象
实例方法
在类中定义实例方法时,定义语法与之前学习的函数定义的方式是一致的。
语法格式
class 类名: def __init__(self, 形参列表): self.属性名 = 参数值
def 方法名(self, 形参列表): ...示例
class Car: def __init__(self, brand, name, price): self.brand = brand self.name = name self.price = price
def running(self): print(f"{self.brand} {self.name} 正在高速行驶...")
def total_cost(self, discount, rate): return self.price * discount + self.price * rate
# 创建对象c1 = Car("BMW", "X5", 500000)total_cost = c1.total_cost(0.9, 0.1)print(f"提车总价为:{total_price:.0f}")
c1.running()注意:
self表示当前实例对象,方法调用时无需传递
魔法方法
魔法方法是指Python中提供的以双下划线开头和结尾的特殊方法,用于定义类的特殊行为,比如:__init__。
魔法方法是不需要我们手动调用的,Python会在合适的时机自动调用。
常用魔法方法
| 魔法方法 | 描述 |
|---|---|
__init__ | 初始化方法 |
__str__ | 字符串表示的方法 |
__eq__ | 比较两个对象是否相等(equal) |
__lt__、__le__、__gt__、__ge__ | 支持比较两个对象的大小(小于、小于等于、大于、大于等于) |
示例
class Car: def __init__(self, brand, name, price): self.brand = brand self.name = name self.price = price
def running(self): print(f"{self.brand} {self.name} 正在高速行驶...")
def __str__(self): return f"{self.brand} {self.name} {self.price}"
def __eq__(self, other): return self.price == other.price and self.brand == other.brand and self.name == other.name
def __lt__(self, other): return self.price < other.price
# 测试c1 = Car("BMW", "X5", 500000)print(c1) # BMW X5 500000
c2 = Car("BMW", "X5", 500000)print(c2) # BMW X5 500000
print(c1 == c2) # Trueprint(c1 < c2) # False魔法方法小结
-
什么是魔法方法?
- Python中提供的
__xxx__形式的特殊方法 - 魔法方法无需手动调用,Python会在合适的时机自动调用
- Python中提供的
-
常用的魔法方法有哪些,作用是什么?
__init__:初始化方法__str__:字符串表示__eq__:判断相等__lt__、__le__、__gt__、__ge__:比较大小
实例属性与类属性
属性分为:
- 实例属性:实例属性属于每个具体对象的属性,每个对象都是独立的。(各个对象特有的数据)
- 类属性:类属性是属于类本身的属性,所有实例共享的。(所有对象共享的数据或配置)
示例
class Car: wheel = 4 # 轮胎数量(类属性) tax_rate = 0.1 # 购置税(类属性)
def __init__(self, c_brand, c_name, c_price): self.brand = c_brand # 实例属性 self.name = c_name # 实例属性 self.price = c_price # 实例属性
def running(self): print(f"{self.brand} {self.name} 正在高速行驶...")
# 创建对象c1 = Car("BYD", "汉", 180000)c2 = Car("Tesla", "Model Y", 260000)
# 类属性:通过 类名.属性 的方式操作print(Car.wheel) # 4print(Car.tax_rate) # 0.1
# 实例属性:通过 实例对象.属性 的方式操作print(c1.brand) # BYDprint(c2.brand) # Tesla注意事项
- 通过实例查找属性时,会先查找实例属性,实例属性不存在时,再查找类属性
总结口诀
- 面向过程:关注流程步骤,一步步来
- 面向对象:关注谁来做,对象来帮忙
- 类是模板:定义属性和方法
- 对象是实例:用类创建出来
__init__:初始化方法,创建时自动调self:代表自己,方法第一个参数- 实例属性:对象独有,各自独立
- 类属性:大家共享,类名访问
- 魔法方法:双下划线包围,自动调用不用管
综合练习:购物车管理系统
这个案例综合运用了类的定义、实例方法、魔法方法等知识点,是一个很好的面向对象编程练习。
案例需求
开发一个购物车管理系统,实现商品信息的添加、修改、删除、查询功能:
- 添加购物车:录入商品名称、价格、数量
- 修改购物车:根据商品名称修改价格和数量
- 删除购物车:根据商品名称删除商品
- 查询购物车:展示所有商品信息
- 退出系统
分步引导
第一步:定义商品类 Goods
- 定义
__init__方法,初始化name、price、num属性 - 定义
__str__方法,返回商品信息字符串
第二步:为商品类添加修改方法
- 定义
update_info方法,可以修改价格和数量 - 使用默认参数
price=None, num=None
第三步:定义购物车类 ShoppingCart
- 定义类属性
system_version和system_name - 定义
__init__方法,初始化空列表goods_list
第四步:实现添加商品功能
- 获取用户输入的商品信息
- 检查商品是否已存在
- 创建 Goods 对象并添加到列表
第五步:实现修改商品功能
- 根据名称查找商品
- 调用商品的
update_info方法
第六步:实现删除商品功能
- 根据名称查找商品
- 用
remove()从列表中删除
第七步:实现查询功能
- 遍历列表,打印每个商品(会自动调用
__str__方法)
第八步:实现主循环
- 用
while True显示菜单 - 用
match...case匹配用户选择
涉及知识点
| 知识点 | 在代码中的应用 |
|---|---|
| 类的定义 | class Goods:、class ShoppingCart: |
__init__ 方法 | 初始化对象属性 |
__str__ 方法 | 自定义对象的字符串表示 |
| 实例方法 | add_goods()、update_goods() 等 |
| 类属性 | system_version、system_name |
| 实例属性 | self.goods_list、self.name |
| 列表 | 存储商品对象 |
| for 循环 | 遍历商品列表 |
| if 判断 | 检查商品是否存在 |
| match…case | 匹配用户选择 |
参考答案
# 商品类class Goods: def __init__(self, name, price, num): """初始化方法""" self.name = name self.price = price self.num = num
def __str__(self): return f"商品名称: {self.name}, 商品价格: {self.price}, 商品数量: {self.num}"
def update_info(self, price=None, num=None): """修改商品信息""" if price is not None: self.price = price if num is not None: self.num = num
# 购物车系统类class ShoppingCart: system_version = "1.0" system_name = "购物车管理系统"
def __init__(self): self.goods_list = []
def add_goods(self): """添加商品""" name = input("请输入商品名称: ") for goods in self.goods_list: if goods.name == name: print("该商品已在购物车中,添加失败!") return
price = float(input("请输入商品价格: ")) num = int(input("请输入商品数量: "))
if price >= 0 and num >= 0: goods = Goods(name, price, num) self.goods_list.append(goods) print("商品添加成功 ~") else: print("价格和数量必须为非负数!")
def update_goods(self): """修改商品""" name = input("请输入要修改的商品名称: ") for goods in self.goods_list: if goods.name == name: print(f"当前商品信息: {goods}") price = float(input("请输入修改后的商品价格: ")) num = int(input("请输入修改后的商品数量: ")) if price >= 0 and num >= 0: goods.update_info(price, num) print("商品信息修改成功 ~") else: print("价格和数量必须为非负数!") return print("未找到该商品,修改失败!")
def delete_goods(self): """删除商品""" name = input("请输入要删除的商品名称: ") for goods in self.goods_list: if goods.name == name: self.goods_list.remove(goods) print("商品删除成功 ~") return print("未找到该商品,删除失败!")
def query_all_goods(self): """查询所有商品""" if not self.goods_list: print("购物车为空!") return print("购物车中的商品信息:") print("-" * 40) for goods in self.goods_list: print(goods) print("-" * 40) print(f"总计商品数量: {len(self.goods_list)}")
def run(self): """运行系统""" print(f"欢迎使用{ShoppingCart.system_name} V{ShoppingCart.system_version}") while True: print() print("# " * 35) print("# 1.添加商品 2.修改商品 3.删除商品 4.查询购物车 5.退出系统 #") print("# " * 35) choice = input("请选择要执行的操作,输入1-5: ") match choice: case "1": self.add_goods() case "2": self.update_goods() case "3": self.delete_goods() case "4": self.query_all_goods() case "5": print("感谢使用购物车管理系统,再见!") break case _: print("输入错误,请选择1-5之间的菜单功能!")
# 测试if __name__ == '__main__': shopping_cart = ShoppingCart() shopping_cart.run()评论区
如果你喜欢,那么欢迎来到我的世界!
了解更多












