当前位置:
首页 > Python基础教程 >
-
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: 名称修饰实现私有属性
二、标准库增强
-
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
-
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 明确参数和返回值类型
这些工具的组合使用可以显著提高代码的可维护性、可靠性和团队协作效率。
来源:https://www.cnblogs.com/julian-zhang/p/18777657
栏目列表
最新更新
求1000阶乘的结果末尾有多少个0
详解MyBatis延迟加载是如何实现的
IDEA 控制台中文乱码4种解决方案
SpringBoot中版本兼容性处理的实现示例
Spring的IOC解决程序耦合的实现
详解Spring多数据源如何切换
Java报错:UnsupportedOperationException in Col
使用Spring Batch实现批处理任务的详细教程
java中怎么将多个音频文件拼接合成一个
SpringBoot整合ES多个精确值查询 terms功能实
SQL Server 中的数据类型隐式转换问题
SQL Server中T-SQL 数据类型转换详解
sqlserver 数据类型转换小实验
SQL Server数据类型转换方法
SQL Server 2017无法连接到服务器的问题解决
SQLServer地址搜索性能优化
Sql Server查询性能优化之不可小觑的书签查
SQL Server数据库的高性能优化经验总结
SQL SERVER性能优化综述(很好的总结,不要错
开启SQLSERVER数据库缓存依赖优化网站性能
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比