30天学会Python编程:8. Python面向对象编程
off999 2025-06-23 21:20 20 浏览 0 评论
8.1 OOP基础概念
8.1.1 面向对象三大特性
8.1.2 类与对象关系
核心概念:
- 类(Class):对象的蓝图/模板
- 对象(Object):类的具体实例
- 属性(Attribute):对象的状态/数据
- 方法(Method):对象的行为/功能
类比说明:
类 → 饼干模具
对象 → 用模具制作的饼干
属性 → 饼干的形状、颜色
方法 → 饼干可以被吃掉、装饰
8.2 类定义与使用
8.2.1 基本类定义
语法结构:
class ClassName:
"""类文档字符串"""
class_attribute = value # 类属性
def __init__(self, params):
"""构造方法"""
self.instance_attr = params # 实例属性
def method(self):
"""实例方法"""
# 方法体
8.2.2 案例
class BankAccount:
"""银行账户类"""
interest_rate = 0.03 # 类属性(所有账户共享)
def __init__(self, owner, balance=0):
"""初始化账户"""
self.owner = owner # 实例属性
self.balance = balance
def deposit(self, amount):
"""存款"""
self.balance += amount
return self.balance
def withdraw(self, amount):
"""取款"""
if amount > self.balance:
raise ValueError("余额不足")
self.balance -= amount
return self.balance
# 使用示例
account = BankAccount("Alice", 1000)
account.deposit(500)
print(f"{account.owner}的余额: {account.balance}")
8.3 继承与多态
8.3.1 继承实现
基本语法:
class ChildClass(ParentClass):
# 子类特有属性和方法
pass
继承示例:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
raise NotImplementedError("子类必须实现此方法")
class Dog(Animal):
def speak(self):
return f"{self.name}说: 汪汪!"
class Cat(Animal):
def speak(self):
return f"{self.name}说: 喵喵~"
# 多态演示
animals = [Dog("阿黄"), Cat("小花")]
for animal in animals:
print(animal.speak())
8.3.2 方法重写
class SmartAccount(BankAccount):
"""智能账户(继承自BankAccount)"""
def withdraw(self, amount):
"""重写取款方法,增加短信通知"""
result = super().withdraw(amount) # 调用父类方法
print(f"短信通知: 取出{amount}元,余额{result}元")
return result
8.4 特殊方法与运算符重载
8.4.1 常用特殊方法
表8-1 Python常用魔术方法
方法 | 描述 | 调用时机 |
__init__ | 构造方法 | 对象创建时 |
__str__ | 字符串表示 | str(obj)/print(obj) |
__repr__ | 解释器表示 | repr(obj) |
__len__ | 长度 | len(obj) |
__getitem__ | 索引访问 | obj[key] |
__add__ | 加法运算 | obj + other |
8.4.2 运算符重载示例
class Vector:
"""二维向量类"""
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
"""向量加法"""
return Vector(self.x + other.x, self.y + other.y)
def __mul__(self, scalar):
"""向量数乘"""
return Vector(self.x * scalar, self.y * scalar)
def __str__(self):
return f"Vector({self.x}, {self.y})"
# 使用示例
v1 = Vector(2, 3)
v2 = Vector(1, 4)
print(v1 + v2) # Vector(3, 7)
print(v1 * 3) # Vector(6, 9)
8.5 属性控制
8.5.1 属性装饰器
class Temperature:
def __init__(self, celsius):
self._celsius = celsius # 内部存储
@property
def celsius(self):
"""摄氏温度属性"""
return self._celsius
@celsius.setter
def celsius(self, value):
if value < -273.15:
raise ValueError("温度不能低于绝对零度")
self._celsius = value
@property
def fahrenheit(self):
"""只读的华氏温度属性"""
return self._celsius * 9/5 + 32
# 使用示例
temp = Temperature(25)
print(temp.fahrenheit) # 77.0
temp.celsius = 30 # 调用setter方法
8.5.2 描述符协议
class PositiveNumber:
"""正数描述符"""
def __set_name__(self, owner, name):
self.name = name
def __get__(self, obj, objtype):
return obj.__dict__.get(self.name, 0)
def __set__(self, obj, value):
if value <= 0:
raise ValueError("必须为正数")
obj.__dict__[self.name] = value
class Circle:
radius = PositiveNumber() # 描述符实例
def __init__(self, radius):
self.radius = radius # 调用描述符__set__
# 使用示例
c = Circle(5)
print(c.radius) # 5
c.radius = 10 # 正常
c.radius = -1 # ValueError
8.6 类高级特性
8.6.1 类方法与静态方法
class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
@classmethod
def from_string(cls, date_str):
"""类方法作为替代构造函数"""
year, month, day = map(int, date_str.split('-'))
return cls(year, month, day)
@staticmethod
def is_valid(date_str):
"""静态方法-与类相关但不依赖实例"""
try:
year, month, day = map(int, date_str.split('-'))
return month <= 12 and day <= 31
except:
return False
# 使用示例
date = Date.from_string("2023-07-20")
print(Date.is_valid("2023-02-30")) # False
8.6.2 抽象基类
from abc import ABC, abstractmethod
class Shape(ABC):
"""形状抽象基类"""
@abstractmethod
def area(self):
pass
@abstractmethod
def perimeter(self):
pass
class Circle(Shape):
"""实现抽象方法"""
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius ** 2
def perimeter(self):
return 2 * 3.14 * self.radius
# 不能实例化抽象类
# shape = Shape() # 报错
circle = Circle(5) # 正常
8.7 综合应用举例
案例1:电商商品系统
class Product:
"""商品基类"""
def __init__(self, name, price, stock):
self.name = name
self.price = price
self.stock = stock
def apply_discount(self, percent):
"""应用折扣"""
self.price *= (1 - percent/100)
def __str__(self):
return f"{self.name} - yen{self.price:.2f} (库存: {self.stock})"
class DigitalProduct(Product):
"""数码商品"""
def __init__(self, name, price, stock, license_key):
super().__init__(name, price, stock)
self.license_key = license_key
def activate(self, user):
"""激活许可证"""
print(f"{user} 已激活产品 {self.name}, 许可证: {self.license_key}")
class ShoppingCart:
"""购物车类"""
def __init__(self):
self.items = []
def add_item(self, product, quantity=1):
"""添加商品"""
if quantity > product.stock:
raise ValueError("库存不足")
self.items.append((product, quantity))
def total(self):
"""计算总价"""
return sum(p.price * q for p, q in self.items)
def checkout(self):
"""结算"""
total = self.total()
print(f"结算完成,总计: yen{total:.2f}")
for product, quantity in self.items:
product.stock -= quantity
self.items = []
# 使用示例
iphone = DigitalProduct("iPhone 14", 6999, 10, "XYZ-123-ABC")
book = Product("Python编程", 99, 50)
cart = ShoppingCart()
cart.add_item(iphone)
cart.add_item(book, 2)
cart.checkout()
print(iphone.stock) # 9
案例2:游戏角色系统
class Character:
"""游戏角色基类"""
def __init__(self, name, health, attack):
self.name = name
self.health = health
self.attack = attack
self.skills = []
def take_damage(self, damage):
"""受到伤害"""
self.health = max(0, self.health - damage)
print(f"{self.name}受到{damage}点伤害,剩余生命: {self.health}")
return self.health <= 0
def use_skill(self, skill, target):
"""使用技能"""
if skill not in self.skills:
print(f"技能{skill}不存在")
return False
damage = self.attack + skill.damage
print(f"{self.name}对{target.name}使用{skill.name}!")
return target.take_damage(damage)
class Skill:
"""技能类"""
def __init__(self, name, damage, cost):
self.name = name
self.damage = damage
self.cost = cost
def __str__(self):
return f"{self.name}(伤害:{self.damage}, 消耗:{self.cost})"
class Warrior(Character):
"""战士职业"""
def __init__(self, name):
super().__init__(name, health=150, attack=20)
self.skills = [
Skill("重击", 15, 10),
Skill("旋风斩", 30, 25)
]
class Mage(Character):
"""法师职业"""
def __init__(self, name):
super().__init__(name, health=100, attack=30)
self.skills = [
Skill("火球术", 40, 20),
Skill("冰冻术", 25, 15)
]
# 战斗演示
hero = Warrior("英雄")
enemy = Mage("邪恶法师")
print(f"战斗开始: {hero.name} vs {enemy.name}")
hero.use_skill(hero.skills[1], enemy) # 旋风斩
enemy.use_skill(enemy.skills[0], hero) # 火球术
8.8 学习路线图
8.9 学习总结
- 核心要点:
- 理解类与对象的关系
- 掌握继承与多态的实现
- 熟练使用特殊方法
- 理解属性访问控制机制
- 实践建议:
- 遵循单一职责原则设计类
- 优先使用组合而非继承
- 合理使用属性装饰器
- 为重要方法添加类型注解
- 进阶方向:
- 元类编程
- 对象序列化
- 多继承与MRO
- 设计模式应用
- 常见陷阱:
- 混淆类属性与实例属性
- 错误的重写方法签名
- 浅拷贝导致的共享状态
- 过度使用继承导致紧耦合
持续更新Python编程学习日志与技巧,敬请关注!
相关推荐
- 大文件传不动?WinRAR/7-Zip 入门到高手,这 5 个技巧让你效率翻倍
-
“这200张照片怎么传给女儿?微信发不了,邮箱附件又超限……”62岁的张阿姨对着电脑犯愁时,儿子只用了3分钟就把照片压缩成一个文件,还教她:“以后用压缩软件,比打包行李还方便!”职场人更懂这...
- 电脑解压缩软件推荐——7-Zip:免费、高效、简洁的文件管理神器
-
在日常工作中,我们经常需要处理压缩文件。无论是下载软件包、接收文件,还是存储大量数据,压缩和解压缩文件都成为了我们日常操作的一部分。而说到压缩解压软件,7-Zip绝对是一个不可忽视的名字。今天,我就来...
- 设置了加密密码zip文件要如何打开?这几个方法可以试试~
-
Zip是一种常见的压缩格式文件,文件还可以设置密码保护。那设置了密码的Zip文件要如何打开呢?不清楚的小伙伴一起来看看吧。当我们知道密码想要打开带密码的Zip文件,我们需要用到适用于Zip格式的解压缩...
- 大文件想要传输成功,怎么把ZIP文件分卷压缩
-
不知道各位小伙伴有没有这样的烦恼,发送很大很大的压缩包会受到限制,为此,想要在压缩过程中将文件拆分为几个压缩包并且同时为所有压缩包设置加密应该如何设置?方法一:使用7-Zip免费且强大的文件管理工具7...
- 高效处理 RAR 分卷压缩包:合并解压操作全攻略
-
在文件传输和存储过程中,当遇到大文件时,我们常常会使用分卷压缩的方式将其拆分成多个较小的压缩包,方便存储和传输。RAR作为一种常见的压缩格式,分卷压缩包的使用频率也很高。但很多人在拿到RAR分卷...
- 2个方法教你如何删除ZIP压缩包密码
-
zip压缩包设置了加密密码,每次解压文件都需要输入密码才能够顺利解压出文件,当压缩包文件不再需要加密的时候,大家肯定想删除压缩包密码,或是忘记了压缩包密码,想要通过删除操作将压缩包密码删除,就能够顺利...
- 速转!漏洞预警丨压缩软件Winrar目录穿越漏洞
-
WinRAR是一款功能强大的压缩包管理器,它是档案工具RAR在Windows环境下的图形界面。该软件可用于备份数据,缩减电子邮件附件的大小,解压缩从Internet上下载的RAR、ZIP及其它类...
- 文件解压方法和工具分享_文件解压工具下载
-
压缩文件减少文件大小,降低文件失效的概率,总得来说好处很多。所以很多文件我们下载下来都是压缩软件,很多小伙伴不知道怎么解压,或者不知道什么工具更好,所以今天做了文件解压方法和工具的分享给大家。一、解压...
- [python]《Python编程快速上手:让繁琐工作自动化》学习笔记3
-
1.组织文件笔记(第9章)(代码下载)1.1文件与文件路径通过importshutil调用shutil模块操作目录,shutil模块能够在Python程序中实现文件复制、移动、改名和删除;同时...
- Python内置tarfile模块:读写 tar 归档文件详解
-
一、学习目标1.1学习目标掌握Python内置模块tarfile的核心功能,包括:理解tar归档文件的原理与常见压缩格式(gzip/bz2/lzma)掌握tar文件的读写操作(创建、解压、查看、过滤...
- 使用python展开tar包_python拓展
-
类Unix的系统,打包文件经常使用的就是tar包,结合zip工具,可以方便的打包并解压。在python的标准库里面有tarfile库,可以方便实现生成了展开tar包。使用这个库最大的好处,可能就在于不...
- 银狐钓鱼再升级:白文件脚本化实现GO语言后门持久驻留
-
近期,火绒威胁情报中心监测到一批相对更为活跃的“银狐”系列变种木马。火绒安全工程师第一时间获取样本并进行分析。分析发现,该样本通过阿里云存储桶下发恶意文件,采用AppDomainManager进行白利...
- ZIP文件怎么打开?2个简单方法教你轻松搞定!
-
在日常工作和生活中,我们经常会遇到各种压缩文件,其中最常见的格式之一就是ZIP。ZIP文件通过压缩数据来减少文件大小,方便我们进行存储和传输。然而,对于初学者来说,如何打开ZIP文件可能会成为一个小小...
- Ubuntu—解压多个zip压缩文件.zip .z01 .z02
-
方法将所有zip文件放在同一目录中:zip_file.z01,zip_file.z02,zip_file.z03,...,zip_file.zip。在Zip3.0版本及以上,使用下列命令:将所有zi...
- 如何使用7-Zip对文件进行加密压缩
-
7-Zip是一款开源的文件归档工具,支持多种压缩格式,并提供了对压缩文件进行加密的功能。使用7-Zip可以轻松创建和解压.7z、.zip等格式的压缩文件,并且可以通过设置密码来保护压缩包中的...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)