python OOP 面向对象编程实践
在 Python 中实现面向对象编程(OOP)可以通过原生语法结合现代工具提升代码质量。以下是分层总结:
一、Python OOP 基础特性
Python 原生支持以下 OOP 核心概念:
-
类与对象
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!"
-
特殊方法
__init__
: 构造函数__str__
: 字符串表示__add__
: 运算符重载
-
访问控制
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]) # 自动校验数据结构
五、关键实践建议
- 优先组合而非继承:避免复杂的继承链
- 类型提示:始终为公开方法添加类型注解
- 利用数据类:Python 3.7+ 的
@dataclass
简化简单类 - 混合使用工具:
abc
定义接口契约pydantic
处理数据校验typing
明确参数和返回值类型
这些工具的组合使用可以显著提高代码的可维护性、可靠性和团队协作效率。