python OOP 面向对象编程实践

在 Python 中实现面向对象编程(OOP)可以通过原生语法结合现代工具提升代码质量。以下是分层总结:


一、Python OOP 基础特性

Python 原生支持以下 OOP 核心概念:

  1. 类与对象

    class Animal:
        def __init__(self, name: str):
            self.name = name  # 封装属性
      
        def speak(self) -> str:
            raise NotImplementedError("子类必须实现此方法")
    
    class Dog(Animal):  # 继承
        def speak(self) -> str:  # 多态
            return "Woof!"
    
  2. 特殊方法

    • __init__: 构造函数
    • __str__: 字符串表示
    • __add__: 运算符重载
  3. 访问控制

    • self.name: 公有属性
    • self._protected_var: 约定保护属性
    • self.__private_var: 名称修饰实现私有属性

二、标准库增强

1. abc 模块 (Abstract Base Classes)

强制子类实现接口,避免忘记覆盖方法:

from abc import ABC, abstractmethod

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

class Circle(Shape):
    def __init__(self, radius: float):
        self.radius = radius
  
    def area(self) -> float:  # 必须实现抽象方法
        return 3.14 * self.radius**2

2. typing 模块

静态类型注解,提升代码可读性和 IDE 支持:

from typing import List, Optional

class User:
    def __init__(self, name: str, emails: Optional[List[str]] = None):
        self.name = name
        self.emails = emails or []
  
    @classmethod
    def create_admin(cls) -> "User":
        return cls(name="Admin")

三、现代工具增强 - Pydantic

数据验证和设置管理的封装工具:

from pydantic import BaseModel, ValidationError, validator

class Employee(BaseModel):
    name: str
    age: int
    email: str

    @validator("age")
    def check_age(cls, value):
        if value < 18:
            raise ValueError("年龄必须 >= 18")
        return value

try:
    emp = Employee(name="John", age=17, email="john@example.com")
except ValidationError as e:
    print(e.json())

关键优势

  • 自动类型验证
  • 数据序列化/反序列化(JSON/dict 转换)
  • 自定义验证器

四、综合使用示例

结合所有工具的高可维护代码:

from abc import ABC, abstractmethod
from pydantic import BaseModel
from typing import List

# 抽象接口
class DatabaseConnector(ABC):
    @abstractmethod
    def connect(self) -> None:
        pass
  
    @abstractmethod
    def query(self, sql: str) -> List[dict]:
        pass

# 数据模型
class UserModel(BaseModel):
    id: int
    name: str
    is_active: bool = True  # 默认值

# MySQL 具体实现
class MySQLConnector(DatabaseConnector):
    def __init__(self, host: str, user: str):
        self.host = host
        self.user = user
        self._connection = None  # 私有属性
  
    def connect(self):
        self._connection = f"Connected to {self.host} as {self.user}"
  
    def query(self, sql: str) -> List[dict]:
        # 模拟查询
        return [{"id": 1, "name": "Alice"}]

# 使用示例
conn = MySQLConnector(host="localhost", user="admin")
conn.connect()
user_data = conn.query("SELECT * FROM users")
user = UserModel(**user_data[0])  # 自动校验数据结构

五、关键实践建议

  1. 优先组合而非继承:避免复杂的继承链
  2. 类型提示:始终为公开方法添加类型注解
  3. 利用数据类:Python 3.7+ 的 @dataclass 简化简单类
  4. 混合使用工具
    • abc 定义接口契约
    • pydantic 处理数据校验
    • typing 明确参数和返回值类型

这些工具的组合使用可以显著提高代码的可维护性、可靠性和团队协作效率。

posted @ 2025-03-17 21:20  julian-zhang  阅读(163)  评论(0)    收藏  举报