第五篇: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 装饰器,参数为cls | Counter.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)))