python 面向对象编程(python 面向对象编程的代码)
off999 2025-07-03 18:48 39 浏览 0 评论
Python 的面向对象编程(OOP)将数据和操作封装在对象中,以下是深度解析和现代最佳实践:
一、核心概念重构
1.类与实例的底层机制
class Robot:
__slots__ = ['name'] # 限制动态属性,节省内存
def __init__(self, name):
self.name = name # 实例属性存储于__dict__(除非用__slots__)
def greet(self):
print(f"Hello, I'm {self.name}")
# 类创建过程实际调用type元类
MyClass = type('MyClass', (), {'attr': 100})2.方法解析顺序(MRO)
class A: pass
class B(A): pass
class C(A): pass
class D(B, C): pass
print(D.__mro__) # 输出:(D, B, C, A, object)
# 方法查找遵循C3线性化算法二、现代类设计模式
1.数据类(Python 3.7+)
from dataclasses import dataclass, field
from typing import ClassVar
@dataclass(order=True)
class Point:
x: float
y: float
version: ClassVar[str] = "1.0" # 类属性
history: list[str] = field(default_factory=list) # 可变默认值
p = Point(1.5, 2.5)2.协议类(结构化类型,Python 3.8+)
from typing import Protocol, runtime_checkable
@runtime_checkable
class Flyer(Protocol):
def fly(self) -> str: ...
class Bird:
def fly(self) -> str:
return "Flapping wings"
def takeoff(entity: Flyer) -> None:
print(entity.fly())
takeoff(Bird()) # 鸭子类型检查三、高级特性剖析
1.描述符协议
class Validated:
def __set_name__(self, owner, name):
self.private_name = f"_{name}"
def __get__(self, obj, objtype=None):
return getattr(obj, self.private_name)
def __set__(self, obj, value):
self.validate(value)
setattr(obj, self.private_name, value)
def validate(self, value):
if not isinstance(value, int):
raise ValueError("必须是整数")
class Model:
age = Validated() # 描述符实例2.上下文管理器协议
class DatabaseConnection:
def __enter__(self):
self.conn = connect_db()
return self.conn
def __exit__(self, exc_type, exc_val, exc_tb):
self.conn.close()
if exc_type is not None:
logging.error(f"操作异常: {exc_val}")
return True # 抑制异常
with DatabaseConnection() as conn:
conn.execute("...")
四、元编程进阶
1.动态类创建
def make_class(class_name, **attrs):
attrs['__annotations__'] = {k: type(v) for k, v in attrs.items()}
return type(class_name, (), attrs)
User = make_class('User', name=str, age=int)2.元类控制实例化
class SingletonMeta(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super().__call__(*args, **kwargs)
return cls._instances[cls]
class Logger(metaclass=SingletonMeta):
pass五、性能优化技巧
1.内存优化
class Lightweight:
__slots__ = ['x', 'y'] # 禁用__dict__,节省内存30-50%
def __init__(self, x, y):
self.x = x
self.y = y2.方法调用加速
from functools import lru_cache
class Fibonacci:
@lru_cache(maxsize=None)
def calculate(self, n):
if n < 2:
return n
return self.calculate(n-1) + self.calculate(n-2)六、设计模式实现
1.策略模式(函数优先)
class PaymentProcessor:
def __init__(self, strategy):
self._strategy = strategy
def execute(self, amount):
return self._strategy(amount)
# 策略作为函数
credit_card_strategy = lambda amt: f"Credit: {amt}"
processor = PaymentProcessor(credit_card_strategy)2.观察者模式(现代实现)
from typing import Protocol, Callable
from dataclasses import dataclass, field
class Observer(Protocol):
def update(self, message: str) -> None: ...
@dataclass
class Subject:
_observers: list[Observer] = field(default_factory=list)
def attach(self, observer: Observer) -> None:
self._observers.append(observer)
def notify(self, message: str) -> None:
for obs in self._observers:
obs.update(message)七、类型系统集成
1.泛型类(Python 3.9+)
from typing import Generic, TypeVar
T = TypeVar('T')
class Box(Generic[T]):
def __init__(self, item: T):
self._item = item
def get(self) -> T:
return self._item
int_box = Box[int](42) # 类型安全容器2.自引用类型
from typing import Self # Python 3.11+
class Node:
def __init__(self, value: int, next: Self | None = None):
self.value = value
self.next = next八、最佳实践总结
组合优于继承
- 使用依赖注入代替深度继承链
- 通过Protocol实现接口隔离
不可变数据优先
from dataclasses import dataclass
@dataclass(frozen=True) # 不可变实例
class ImmutablePoint:
x: float
y: float- SOLID原则应用
- 单一职责:每个类只做一件事
- 开闭原则:通过扩展而非修改现有代码
- 依赖倒置:依赖抽象而非具体实现
- 性能与可读性平衡
- 场景推荐方案简单数据容器dataclass大量实例__slots__高频方法调用@lru_cache类型安全TypeVar + Generic
Python 的 OOP 本质是 基于字典的命名空间系统,理解 __dict__、__class__ 和元类机制后,可以构建出既灵活又高效的面向对象架构。
相关推荐
- win11 16g内存最佳虚拟内存(window10 16个g虚拟内存设置)
-
内存足够大可以将系统的虚拟内存关掉。1、鼠标右键【此电脑】,在菜单中选择【属性】。2、进入属性后,点击【高级系统设置】。3、进入系统属性后,点击高级下面的【设置】。4、进入性能设置后,点击【高级】。5...
- 查看windows7激活码(win7激活码哪里看)
-
windows7激活密钥如下:PPBK3-M92CH-MRR9X-34Y9P-7CH2FQ8JXJ-8HDJR-X4PXM-PW99R-KTJ3H8489X-THF3D-BDJQR-D27PH-P...
- win10商业版和消费者版区别(win10商业版与消费者版)
-
1、用户群体的区别消费者版:通俗来说就是零售版,是一个非常适合个人用户和家庭用户购买的版本。商业版:适合大客户使用的版本,而且还比较适合企业用户使用以及进行批量部署。2、版本区别消费者版Consume...
- bilibili加速器(bilibili加速器手机版官网)
-
需要在电脑上使用bilibili加速器,因为手机上bilibili已经有自带的加速器功能了。可以在bilibili官网或者一些应用商店下载使用,下完后按照安装提示进行安装即可。如果使用的是第三方软件,...
- 电脑自带的清理垃圾的工具(电脑自带的清理垃圾的工具叫什么)
-
CCleaner是一款免费的系统优化和隐私保护工具,它的体积小、扫描速度非常快,支持自定义清理规则,增强了应用程序清理范围和效果。CCleaner是Piriform(梨子公司)最著名广受好评的系统清理...
- 如何设置本地连接
-
在“控制面板”中,选择“网络和Internet”>“网络和共享中心”。在左侧窗格中,选择“更改适配器设置”。在“网络连接”窗口中,右键单击“本地连接”,然后选择“属性”。在“本地连接...
- 戴尔官网官方网站(戴尔产品官网)
-
查询步骤如下:1.在戴尔电脑的后盖上找到服务编号,并记录下来。2.之后搜索戴尔官网,在打开的官网界面中点击上方的支持选项,并点击产品支持。3.在打开的产品支持界面中,输入电脑后盖上的服务编号。4.如果...
- 黑鲨u盘重装系统教程(黑鲨u盘重装系统步骤8)
-
U盘重装WIn10系统:1、用【u深度u盘启动盘制作工具】制作u盘启动盘,插入电脑usb接口,设置好开机启动项进入u深度主菜单界面,选择“【02】u深度win8pe标准版(新机器)”并回车,2、在u深...
- 电子邮件免费注册入口(电子邮件在线注册)
-
1.在网页上搜索maiI163邮箱登录,如果有邮箱账号密码的话就直接输入并点击“登录”,没有的话就点击“立即注册”。2.点击“立即注册”后进入页面,输入信息点击“注册”。3.注册成功后就直接搜索登录。...
-
- win7如何快速启动(windows7如何快速启动)
-
打开操作系统运行:输入"cmd"并点击回车:系统命令提示符自动打开:使用方法直接运行start打开一个新的命令提示符窗口:运行start+文件的绝对存储路径打开对应的文件:运行start+文件夹路径打开对应...
-
2025-12-29 13:03 off999
- 怎么升级到win11(怎么升级到win11专业版)
-
Windows11可以在「开始菜单-设置-Windows更新」中进行手动更新。如果您想主动更新,需先确保您的电脑符合Windows11的最低系统要求。接着,打开「Windows更...
- 微信好友误删了怎么加回来(微信好友误删了怎么加回来免费)
-
看到他的评论的话,你可以去你发过的内容里去看看。<br/><br/>好友验证的消息、语音)或者朋友圈内容:<br/>如果你这个朋友喜欢和你在朋友圈聊天的话,你他的手机号也有的话方法添加里输入就可...
-
- access安装包(access安装包怎么安装)
-
要下载并安装MicrosoftAccess,可以按照以下步骤进行操作:1.打开您的电脑的浏览器(如谷歌浏览器、火狐浏览器等)。2.在浏览器的搜索栏中输入"下载MicrosoftAccess"。3.从搜索结果中选择适...
-
2025-12-29 11:51 off999
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
