Python面向对象编程基础

Python面向对象编程基础

2026年9月16日·#编程学习/python学习笔记Python/面向对象//对象·2646 字 13 分钟
浏览量加载中...
AI 摘要

Python面向对象编程基础,包括面向过程与面向对象对比、类与对象、类的定义、实例方法、魔法方法、实例属性与类属性

面向过程编程#

核心思想:把一个需求分解成一系列要执行的步骤,然后按照步骤依次执行这些任务(关注的是流程、步骤)。

适用场景:面向过程编程非常直接,适合简单、线性的任务。

示例:建筑施工流程#

平整地基 → 地基打桩 → 地基浇筑 → 主体施工 → 砌墙施工 → 外墙施工 → 室内硬装 → 室内软装

面向对象编程#

对象可以理解为现实中具体的人/物在程序中的数字化身(万物皆对象)。

它把一个人/物的特征和功能打包到一起,是面向对象编程的基本单元(关注的是谁来帮我做这件事儿)。

  • 特征 = 属性
  • 功能 = 方法

示例#

对象属性方法
挖掘机颜色、油耗、马力推平、挖掘
混凝土车容量、颜色、臂长搅拌、运输、浇筑
工人工种、年龄、工服颜色、技能打桩、砌墙、浇筑、装修
建材类型、数量、价格、材质存储、运输、焊接、铺贴

类与对象#

:描述的是一组具有相同属性(特征)和方法(功能/行为)的模板。

对象:对象是类的实例,是基于类创建出来的(实例对象)。

示例#

  • :月饼模具(属性:颜色、形状、大小、厚度;功能:提供能量、文化传承)
  • 对象:用模具制作出来的月饼(每个月饼颜色可能不同)

提示:对象是由类创建出来的,创建对象的过程,也称为对象的实例化。一个类可以创建无数个对象。


目录#

  • 类与对象
  • 实例方法
  • 魔法方法
  • 实例属性与类属性
  • 案例

类的定义#

语法格式#

# 定义类
class 类名:
pass

方式1:动态添加属性(不推荐)#

# 定义类
class Car:
pass
# 创建对象
c1 = Car()
c1.brand = "BMW"
c1.name = "X5"
c1.price = 500000
print(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__)

类的定义小结#

  1. 定义类时,类名的命名规范?

    • 大驼峰命名法,如 UserInfoUserAccount
  2. 定义类时,__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) # True
print(c1 < c2) # False

魔法方法小结#

  1. 什么是魔法方法?

    • Python中提供的 __xxx__ 形式的特殊方法
    • 魔法方法无需手动调用,Python会在合适的时机自动调用
  2. 常用的魔法方法有哪些,作用是什么?

    • __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) # 4
print(Car.tax_rate) # 0.1
# 实例属性:通过 实例对象.属性 的方式操作
print(c1.brand) # BYD
print(c2.brand) # Tesla

注意事项#

  • 通过实例查找属性时,会先查找实例属性,实例属性不存在时,再查找类属性

总结口诀#

  • 面向过程:关注流程步骤,一步步来
  • 面向对象:关注谁来做,对象来帮忙
  • 类是模板:定义属性和方法
  • 对象是实例:用类创建出来
  • __init__:初始化方法,创建时自动调
  • self:代表自己,方法第一个参数
  • 实例属性:对象独有,各自独立
  • 类属性:大家共享,类名访问
  • 魔法方法:双下划线包围,自动调用不用管

综合练习:购物车管理系统#

这个案例综合运用了类的定义、实例方法、魔法方法等知识点,是一个很好的面向对象编程练习。

案例需求#

开发一个购物车管理系统,实现商品信息的添加、修改、删除、查询功能:

  1. 添加购物车:录入商品名称、价格、数量
  2. 修改购物车:根据商品名称修改价格和数量
  3. 删除购物车:根据商品名称删除商品
  4. 查询购物车:展示所有商品信息
  5. 退出系统

分步引导#

第一步:定义商品类 Goods

  • 定义 __init__ 方法,初始化 namepricenum 属性
  • 定义 __str__ 方法,返回商品信息字符串

第二步:为商品类添加修改方法

  • 定义 update_info 方法,可以修改价格和数量
  • 使用默认参数 price=None, num=None

第三步:定义购物车类 ShoppingCart

  • 定义类属性 system_versionsystem_name
  • 定义 __init__ 方法,初始化空列表 goods_list

第四步:实现添加商品功能

  • 获取用户输入的商品信息
  • 检查商品是否已存在
  • 创建 Goods 对象并添加到列表

第五步:实现修改商品功能

  • 根据名称查找商品
  • 调用商品的 update_info 方法

第六步:实现删除商品功能

  • 根据名称查找商品
  • remove() 从列表中删除

第七步:实现查询功能

  • 遍历列表,打印每个商品(会自动调用 __str__ 方法)

第八步:实现主循环

  • while True 显示菜单
  • match...case 匹配用户选择

涉及知识点#

知识点在代码中的应用
类的定义class Goods:class ShoppingCart:
__init__ 方法初始化对象属性
__str__ 方法自定义对象的字符串表示
实例方法add_goods()update_goods()
类属性system_versionsystem_name
实例属性self.goods_listself.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()

评论区

[ 标签 ]
# AI37# AI 编程2# AI工具1# Ajax2# Apifox1# AstrBot3# Astro2# CC Switch1# CDN2# Claude Code1# claudecode2# ClaudeCode1# Cloudflare2# CloudFlare2# CloudFlare-ImgBed3# coc3# CSS6# DeepSeek6# deepseek2# DELETE1# Docker1# EdgeOne3# Gist1# git1# GitHub1# hexo-circle-of-friends1# HTML6# HTTP5# ImageManager1# Java23# java13# JavaScript5# JDBC3# JSON2# JUnit1# LangChain25# Logback1# Maven6# Muse Spark1# Mybatis1# MyBatis4# MySQL28# MySql1# NapCat1# Node.js1# obsidian2# Obsidian5# OpenCode4# ORM1# PathVariable1# PicGo1# PyCharm1# Python65# RequestBody1# RequestMapping1# RESTful风格1# skills1# Slf4j1# SpringBoot11# SQL2# Streamlit5# Svelte2# TailwindCSS1# Telegram3# Tlias2# Vercel1# vscode2# Vue7# Waline3# WebDAV1# Web基础6# Web开发6# WinSCP1# YAML1# 三层架构1# 中二宣言1# 书籍1# 使用文档10# 写作1# 函数2# 刷步数1# 前端32# 动态1# 动漫1# 包1# 单词2# 博客7# 博客工作流1# 博客开发2# 参数接收1# 友链1# 反思2# 图床6# 地图1# 备份2# 大模型1# 奇思妙想1# 存储1# 学习方法6# 学校1# 宝塔面板3# 宝宝10# 对象1# 导航栏1# 工具2# 开发1# 开发工具1# 开发规范1# 开心1# 异常处理1# 影视2# 微信1# 性能优化2# 总结1# 想法15# 感受1# 感悟11# 指南1# 提示词工程1# 插件5# 故障排除1# 效率工具2# 教程10# 数据分析9# 数据库27# 数据结构1# 文件操作2# 斩神1# 日常92# 日志框架1# 朋友圈1# 朱元璋1# 模块1# 模板1# 正则表达式2# 测试1# 游戏2# 爬虫7# 生活迁移1# 电影2# 电脑1# 碎碎念1# 视觉识别1# 类1# 类型注解1# 网络基础2# 网络教室1# 羊毛2# 脚本2# 脚本工具1# 自动化2# 蓝奏云1# 订阅推荐2# 记录2# 评论系统1# 词根1# 词缀1# 说说1# 足迹1# 跑步2# 路径参数1# 转载2# 运动1# 部落冲突1# 配置1# 随机图1# 面向对象5# 音乐3# 音标1# 饮食1# 驼峰命名1# 高德地图1
[ 公告 ]

如果你喜欢,那么欢迎来到我的世界!

了解更多
[ 音乐 ]
封面

音乐

暂未播放

0:000:00
暂无歌词
找不到相关结果。
[ contents ]
[ 全部文章 ]