当前位置: 首页 > news >正文

第五篇:Python面向对象编程(OOP)深度教程

1. 类与对象

1.1 基本概念

​类​​是创建对象的蓝图,定义了对象的​​属性​​(数据)和​​方法​​(行为)。​​对象​​是类的实例化实体,每个对象拥有独立的属性值和共享的类方法

​示例​​:定义Dog

class Dog:
    species = "Canis familiaris"  # 类属性(所有实例共享)
    
    def __init__(self, name, age):  # 构造函数
        self.name = name  # 实例属性
        self.age = age
    
    def bark(self):  # 实例方法
        print(f"{self.name} says: Woof!")

1.2 构造函数__init__

  • 作用:初始化对象属性,在实例化时自动调用
  • self参数​​:指向实例自身,必须作为方法的第一个参数

​案例​​:学生管理系统

class Student:
    def __init__(self, id, name, grade):
        self.id = id
        self.name = name
        self.grade = grade
    
    def display_info(self):
        print(f"ID: {self.id}, Name: {self.name}, Grade: {self.grade}")

# 实例化
student1 = Student(1, "Alice", 85)
student1.display_info()  # 输出:ID: 1, Name: Alice, Grade: 85

1.3 属性与方法的类型

类型特点示例
​实例属性​每个对象独立存储self.name
​类属性​所有对象共享,修改后全局生效Dog.species
​实例方法​操作实例属性,需包含self参数def bark(self):
​静态方法​不依赖实例/类,用@staticmethod装饰器Math.add(3,5) 

8

​类方法​操作类属性,用@classmethod装饰器,参数为clsCounter.increment()

2. 继承与多态

2.1 继承的实现

  • ​语法​​:class ChildClass(ParentClass):
  • ​优势​​:代码复用、扩展功能

     

​案例​​:动物类的层次结构

class Animal:  # 父类
    def __init__(self, name):
        self.name = name
    
    def speak(self):
        raise NotImplementedError("子类必须实现此方法")

class Dog(Animal):  # 子类
    def speak(self):  # 方法重写
        return f"{self.name} says: Woof!"

class Cat(Animal):
    def speak(self):
        return f"{self.name} says: Meow!"

2.2 super()函数

  • 作用:调用父类方法,避免重复代码
class ElectricCar(Car):
    def __init__(self, brand, color, battery):
        super().__init__(brand, color)  # 调用父类构造函数
        self.battery = battery

2.3 多态的实现

  • ​方式1:继承+方法重写​
    animals = [Dog("Buddy"), Cat("Whiskers")]
    for animal in animals:
        print(animal.speak())  # 同一接口,不同输出
  • ​方式2:鸭子类型​​(动态多态)
    class Bird:
        def fly(self):
            print("Flying with wings")
    
    class Airplane:
        def fly(self):
            print("Flying with engines")
    
    def let_it_fly(obj):
        obj.fly()  # 不检查类型,只关注行为

3. 抽象类与接口设计

3.1 抽象基类(ABC)

  • ​作用​​:强制子类实现特定方法,用abc模块实现
from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    
    def area(self):  # 必须实现
        return 3.14 * self.radius ​**​ 2

3.2 接口的模拟

  • ​设计原则​​:定义行为规范,不关注具体实现
class PaymentInterface(ABC):
    @abstractmethod
    def process_payment(self, amount):
        pass

class WechatPay(PaymentInterface):
    def process_payment(self, amount):
        return f"微信支付{amount}元"

4. 高级特性扩展

4.1 封装与私有属性

  • ​私有化​​:使用双下划线__隐藏数据
class BankAccount:
    def __init__(self, balance):
        self.__balance = balance  # 私有属性
    
    def get_balance(self):  # 公共方法访问
        return self.__balance

4.2 多重继承与MRO

  • ​问题​​:菱形继承可能导致方法冲突
  • ​解决方案​​:Python使用C3算法确定方法解析顺序
class A:
    def show(self):
        print("A")

class B(A):
    def show(self):
        print("B")

class C(A):
    def show(self):
        print("C")

class D(B, C):
    pass

d = D()
d.show()  # 输出B(按MRO顺序:D -> B -> C -> A)

5. 综合实战案例

5.1 游戏角色系统

class GameCharacter:
    def __init__(self, name, health=100):
        self.name = name
        self.__health = health
    
    def take_damage(self, damage):
        self.__health = max(0, self.__health - damage)
        print(f"{self.name}剩余生命:{self.__health}")

class Warrior(GameCharacter):
    def __init__(self, name):
        super().__init__(name, health=120)
        self.armor = 20
    
    def take_damage(self, damage):  # 重写方法
        super().take_damage(max(0, damage - self.armor))

5.2 分页显示系统

class Paginator:
    def __init__(self, total_items, per_page=10):
        self.total_items = total_items
        self.per_page = per_page
    
    def get_page(self, page_num):
        start = (page_num - 1) * self.per_page
        end = start + self.per_page
        return list(range(start, min(end, self.total_items)))

 

相关文章:

  • 关于 微服务负载均衡 的详细说明,涵盖主流框架/解决方案的对比、核心功能、配置示例及总结表格
  • OracleLinuxR5U5系统重启后启动数据库oracle23ai
  • 【前端小技巧】实现详情页滚动位置记忆,提升用户体验
  • Vue接口平台学习六——接口列表及部分调试页面
  • asm汇编语言源代码之-获取环境变量
  • 【c语言】结构体习题
  • Vitis: 使用自定义IP时 Makefile错误 导致编译报错
  • Spring AI使用tool Calling和MCP
  • spring cloud alibaba 的服务治理框架(服务注册与发现)Nacos 使用详解
  • 微信小程序开发常用语法和api
  • 基本的DOS命令
  • 程序化广告行业(80/89):近年发展动态与技术标准演进
  • dolphinscheduler创建文件夹显示存储未启用的问题--已解决
  • Windows for Redis 后台服务运行
  • 驱动学习专栏--写在前面
  • MyBatis-plus 快速入门
  • Mouse without Borders – 用一套鼠标 / 键盘控制四台电脑
  • trae 中设置 python flake8
  • Java中的Map vs Python字典:核心对比与使用指南
  • 【力扣hot100题】(091)最小路径和
  • wordpress 浮动客服/平原县网站seo优化排名
  • 泰州网站建设哪家好/网上销售有哪些方法
  • 怎么做公司网站的手机客户端/一个完整的产品运营方案
  • 弄个做网站公司/广州百度推广代理公司
  • 中国建设银行黄冈分行网站/自助建站网站模板
  • 单位建立一个官网多少钱/seo干什么