LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

30天学会Python编程:8. Python面向对象编程

admin
2025年7月17日 21:45 本文热度 30

1. 面向对象编程基础

1.1 什么是面向对象编程(OOP)

面向对象编程是一种编程范式,它将数据和操作数据的方法组织为对象。核心思想是使用对象来模拟现实世界的实体和行为。

三大核心特性


核心概念解析

  • 类(Class):对象的蓝图或模板,定义对象的属性和方法
  • 对象(Object):类的具体实例,包含实际数据和操作
  • 属性(Attribute):对象的状态或特征(如人的姓名、年龄)
  • 方法(Method):对象的行为或功能(如人的说话、行走)

2. 类定义与使用

2.1 基本类定义

语法结构

class ClassName:
    """类文档字符串"""
    
    class_attr = value  # 类属性(所有实例共享)
    
    def__init__(self, param1, param2):
        """构造方法,初始化实例属性"""
        self.instance_attr1 = param1  # 实例属性
        self.instance_attr2 = param2
        
    definstance_method(self):
        """实例方法,操作实例属性"""
        returnself.instance_attr1 + self.instance_attr2

银行账户类示例

class BankAccount:
    """银行账户类"""
    
    interest_rate = 0.03# 类属性(所有账户共享)
    
    def__init__(self, owner, balance=0):
        self.owner = owner  # 实例属性
        self.balance = balance
    
    defdeposit(self, amount):
        """存款方法"""
        if amount <= 0:
            raise ValueError("存款金额必须大于0")
        self.balance += amount
        returnself.balance
    
    defwithdraw(self, amount):
        """取款方法"""
        if amount <= 0:
            raise ValueError("取款金额必须大于0")
        if amount > self.balance:
            raise ValueError("余额不足")
        self.balance -= amount
        returnself.balance

# 使用示例
alice_account = BankAccount("Alice"1000)
alice_account.deposit(500)
print(f"{alice_account.owner}的余额: {alice_account.balance}")

2.2 类属性 vs 实例属性

特性
类属性
实例属性
定义位置
类内部,方法外部
__init__
或其他方法中
访问方式
类名.属性
 或 实例.属性
只能通过实例访问
内存分配
所有实例共享同一内存
每个实例独立内存
典型用途
常量、共享配置
对象特有状态

注意事项

  • 避免通过实例修改类属性(会创建新的实例属性)
  • 类属性适合存储所有实例共享的数据
  • 实例属性存储对象特有状态

3. 继承与多态

3.1 继承实现

继承允许创建新类(子类)基于现有类(父类),实现代码复用功能扩展

基本语法

class ChildClass(ParentClass):
    # 子类特有属性和方法
    pass

继承示例

class Animal:
    """动物基类"""
    def__init__(self, name):
        self.name = name
    
    defspeak(self):
        """抽象方法,子类必须实现"""
        raise NotImplementedError("子类必须实现speak方法")

classDog(Animal):
    """狗类,继承自动物"""
    defspeak(self):
        returnf"{self.name}说:汪汪!"
    
    deffetch(self, item):
        """狗特有方法"""
        returnf"{self.name}捡回了{item}"

classCat(Animal):
    """猫类,继承自动物"""
    defspeak(self):
        returnf"{self.name}说:喵喵~"
    
    defclimb(self, height):
        """猫特有方法"""
        returnf"{self.name}爬上了{height}米高的树"

# 多态演示
animals = [Dog("阿黄"), Cat("小花")]
for animal in animals:
    print(animal.speak())  # 调用不同实现

3.2 方法重写与super()

子类可以重写父类方法,使用super()调用父类实现:

class SmartAccount(BankAccount):
    """智能账户,继承自BankAccount"""
    
    def __init__(self, owner, balance=0, phone=""):
        super().__init__(owner, balance)  # 调用父类构造方法
        self.phone = phone  # 新增属性
    
    def withdraw(self, amount):
        """重写取款方法,增加短信通知"""
        result = super().withdraw(amount)  # 调用父类方法
        print(f"短信通知{self.phone}: 取出{amount}元,余额{result}元")
        return result

多态的优势

  1. 提高代码灵活性和可扩展性
  2. 统一接口处理不同对象
  3. 易于添加新功能而不修改现有代码

4. 特殊方法与运算符重载

4.1 常用特殊方法

Python使用双下划线方法(魔术方法)实现特殊行为:

方法
描述
调用时机
__init__
对象初始化
创建对象时
__str__
用户友好字符串
print(obj)
 时
__repr__
解释器友好字符串
repr(obj)
 时
__len__
返回长度
len(obj)
 时
__getitem__
索引访问
obj[key]
 时
__setitem__
索引赋值
obj[key] = value
 时
__add__
加法运算
obj + other
 时

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):
        """向量数乘重载"""
        ifisinstance(scalar, (intfloat)):
            return Vector(self.x * scalar, self.y * scalar)
        raise TypeError("标量必须是数值类型")
    
    def__str__(self):
        """用户友好字符串表示"""
        returnf"Vector({self.x}{self.y})"
    
    def__repr__(self):
        """解释器友好字符串表示"""
        returnf"Vector({self.x}{self.y})"

# 使用示例
v1 = Vector(23)
v2 = Vector(14)
v3 = v1 + v2  # 调用__add__
print(v3)      # 调用__str__
v4 = v1 * 3   # 调用__mul__
print(v4)

5. 属性控制

5.1 属性装饰器(@property)

@property允许将方法作为属性访问,实现封装数据验证

class Temperature:
    """温度类,使用属性装饰器"""
    
    def__init__(self, celsius):
        self.celsius = celsius  # 使用setter
    
    @property
    defcelsius(self):
        """获取摄氏温度"""
        returnself._celsius
    
    @celsius.setter
    defcelsius(self, value):
        """设置摄氏温度,带验证"""
        if value < -273.15:
            raise ValueError("温度不能低于绝对零度(-273.15°C)")
        self._celsius = value
    
    @property
    deffahrenheit(self):
        """只读的华氏温度属性"""
        returnself._celsius * 9/5 + 32

# 使用
temp = Temperature(25)
print(f"华氏温度: {temp.fahrenheit}")  # 77.0
temp.celsius = 30# 调用setter

5.2 描述符协议

描述符提供更强大的属性控制机制:

class PositiveNumber:
    """正数描述符"""
    
    def__set_name__(self, owner, name):
        self.storage_name = name  # 存储属性名
    
    def__get__(self, instance, owner):
        return instance.__dict__.get(self.storage_name, 0)
    
    def__set__(self, instance, value):
        if value <= 0:
            raise ValueError("值必须为正数")
        instance.__dict__[self.storage_name] = value

classCircle:
    """圆类,使用描述符控制半径"""
    radius = PositiveNumber()  # 描述符实例
    
    def__init__(self, radius):
        self.radius = radius  # 调用描述符__set__
    
    @property
    defarea(self):
        return3.14 * self.radius ** 2

# 使用
c = Circle(5)
print(c.area)  # 78.5
c.radius = 10
# c.radius = -1  # 引发ValueError

6. 类高级特性

6.1 类方法与静态方法

class Date:
    """日期类"""
    
    def__init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day
    
    @classmethod
    deffrom_string(cls, date_str):
        """类方法:替代构造函数"""
        year, month, day = map(int, date_str.split('-'))
        return cls(year, month, day)  # 创建并返回实例
    
    @staticmethod
    defis_valid(date_str):
        """静态方法:验证日期格式"""
        try:
            year, month, day = map(int, date_str.split('-'))
            return1 <= month <= 12and1 <= day <= 31
        except ValueError:
            returnFalse
    
    def__str__(self):
        returnf"{self.year}-{self.month:02d}-{self.day:02d}"

# 使用
date = Date.from_string("2023-07-20")
print(Date.is_valid("2023-02-30"))  # False

6.2 抽象基类(ABC)

抽象基类定义接口规范,强制子类实现特定方法:

from abc import ABC, abstractmethod

classShape(ABC):
    """形状抽象基类"""
    
    @abstractmethod
    defarea(self):
        """计算面积"""
        pass
    
    @abstractmethod
    defperimeter(self):
        """计算周长"""
        pass

classCircle(Shape):
    """圆形实现"""
    
    def__init__(self, radius):
        self.radius = radius
    
    defarea(self):
        return3.14 * self.radius ** 2
    
    defperimeter(self):
        return2 * 3.14 * self.radius

classRectangle(Shape):
    """矩形实现"""
    
    def__init__(self, width, height):
        self.width = width
        self.height = height
    
    defarea(self):
        returnself.width * self.height
    
    defperimeter(self):
        return2 * (self.width + self.height)

# 使用
shapes = [Circle(5), Rectangle(46)]
for shape in shapes:
    print(f"面积: {shape.area()}, 周长: {shape.perimeter()}")

7. 应用举例

7.1 电商商品系统

class Product:
    """商品基类"""
    
    def__init__(self, name, price, stock):
        self.name = name
        self.price = price
        self.stock = stock
    
    defapply_discount(self, percent):
        """应用折扣"""
        ifnot0 <= percent <= 100:
            raise ValueError("折扣率必须在0-100之间")
        self.price *= (1 - percent/100)
    
    def__str__(self):
        returnf"{self.name} - ¥{self.price:.2f} (库存: {self.stock})"

classDigitalProduct(Product):
    """数码商品"""
    
    def__init__(self, name, price, stock, license_key):
        super().__init__(name, price, stock)
        self.license_key = license_key
    
    defactivate(self, user):
        """激活许可证"""
        print(f"{user} 已激活产品 {self.name}, 许可证: {self.license_key}")

classShoppingCart:
    """购物车"""
    
    def__init__(self):
        self.items = []  # 存储(商品, 数量)元组
    
    defadd_item(self, product, quantity=1):
        """添加商品到购物车"""
        if quantity <= 0:
            raise ValueError("数量必须大于0")
        if quantity > product.stock:
            raise ValueError(f"{product.name}库存不足")
        self.items.append((product, quantity))
    
    defremove_item(self, product):
        """从购物车移除商品"""
        self.items = [(p, q) for p, q inself.items if p != product]
    
    deftotal(self):
        """计算总价"""
        returnsum(p.price * q for p, q inself.items)
    
    defcheckout(self):
        """结算"""
        total = self.total()
        print(f"结算完成,总计: ¥{total:.2f}")
        for product, quantity inself.items:
            product.stock -= quantity
        self.items = []

# 使用
iphone = DigitalProduct("iPhone 14"699910"XYZ-123-ABC")
python_book = Product("Python编程"9950)

cart = ShoppingCart()
cart.add_item(iphone)
cart.add_item(python_book, 3)
cart.checkout()

print(f"{iphone.name}剩余库存: {iphone.stock}")  # 9

7.2 游戏角色系统

class Character:
    """游戏角色基类"""
    
    def__init__(self, name, health, attack_power):
        self.name = name
        self.health = health
        self.max_health = health
        self.attack_power = attack_power
        self.skills = []
    
    deftake_damage(self, damage):
        """受到伤害"""
        self.health = max(0self.health - damage)
        print(f"{self.name}受到{damage}点伤害,剩余生命: {self.health}")
        returnself.is_dead()
    
    defis_dead(self):
        """检查是否死亡"""
        returnself.health <= 0
    
    defuse_skill(self, skill_index, target):
        """使用技能"""
        if skill_index >= len(self.skills):
            print("无效技能索引")
            returnFalse
        
        skill = self.skills[skill_index]
        damage = self.attack_power + skill.damage
        print(f"{self.name}{target.name}使用{skill.name}!")
        return target.take_damage(damage)
    
    defheal(self, amount):
        """治疗"""
        self.health = min(self.max_health, self.health + amount)
        print(f"{self.name}恢复了{amount}点生命,当前生命: {self.health}")

classSkill:
    """技能类"""
    
    def__init__(self, name, damage, cost):
        self.name = name
        self.damage = damage
        self.cost = cost
    
    def__str__(self):
        returnf"{self.name}(伤害:{self.damage}, 消耗:{self.cost})"

classWarrior(Character):
    """战士职业"""
    
    def__init__(self, name):
        super().__init__(name, health=150, attack_power=20)
        self.skills = [
            Skill("重击"1510),
            Skill("旋风斩"3025)
        ]
    
    defshield_block(self):
        """战士特有技能:格挡"""
        print(f"{self.name}举盾格挡下一次攻击")

classMage(Character):
    """法师职业"""
    
    def__init__(self, name):
        super().__init__(name, health=100, attack_power=15)
        self.mana = 100
        self.skills = [
            Skill("火球术"4020),
            Skill("冰冻术"2515)
        ]
    
    defuse_skill(self, skill_index, target):
        """重写技能使用,检查法力值"""
        skill = self.skills[skill_index]
        ifself.mana < skill.cost:
            print(f"法力不足,无法使用{skill.name}")
            returnFalse
        
        self.mana -= skill.cost
        returnsuper().use_skill(skill_index, target)

# 战斗演示
hero = Warrior("英雄")
enemy = Mage("黑暗法师")

print(f"战斗开始: {hero.name} vs {enemy.name}")
hero.use_skill(1, enemy)  # 使用旋风斩
enemy.use_skill(0, hero)  # 使用火球术
hero.heal(30)

8. 学习路径与总结


8.1 核心要点总结

  1. 类与对象:类是蓝图,对象是实例
  2. 封装:隐藏内部实现,暴露必要接口
  3. 继承:实现代码复用和功能扩展
  4. 多态:统一接口处理不同对象
  5. 特殊方法:定制类行为,实现运算符重载
  6. 属性控制:使用@property和描述符管理属性访问

8.2 实践建议

  • 单一职责原则:每个类只负责一项功能
  • 优先组合而非继承:降低类间耦合度
  • 合理使用属性装饰器:封装数据访问
  • 类型注解:提高代码可读性和可维护性
  • 遵循命名规范:类名用大驼峰,方法名用小写蛇形

8.3 进阶方向

  1. 元类编程
  2. 对象序列化与持久化
  3. 多继承与方法解析顺序(MRO)
  4. 设计模式应用(工厂、单例、观察者等)
  5. 异步对象模式

8.4 常见问题

  1. 共享状态问题:错误使用类属性导致数据意外共享
  2. 继承滥用:过度继承导致类层次过深
  3. 方法签名不一致:重写方法时参数不匹配
  4. 循环导入:类之间相互引用导致导入问题
  5. 忽略抽象基类:未定义必要接口方法

"面向对象编程不是万能的,但它是组织复杂系统的强大工具。掌握OOP原则,让代码更具表现力和扩展性。"



阅读原文:原文链接


该文章在 2025/7/18 10:27:57 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved