百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

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 = y

2.方法调用加速

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
  1. SOLID原则应用
  2. 单一职责:每个类只做一件事
  3. 开闭原则:通过扩展而非修改现有代码
  4. 依赖倒置:依赖抽象而非具体实现
  5. 性能与可读性平衡
  6. 场景推荐方案简单数据容器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”>“网络和共享中心”。在左侧窗格中,选择“更改适配器设置”。在“网络连接”窗口中,右键单击“本地连接”,然后选择“属性”。在“本地连接...

office2007官方免费版安装包
  • office2007官方免费版安装包
  • office2007官方免费版安装包
  • office2007官方免费版安装包
  • office2007官方免费版安装包
戴尔官网官方网站(戴尔产品官网)

查询步骤如下: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如何快速启动)
win7如何快速启动(windows7如何快速启动)

打开操作系统运行:输入"cmd"并点击回车:系统命令提示符自动打开:使用方法直接运行start打开一个新的命令提示符窗口:运行start+文件的绝对存储路径打开对应的文件:运行start+文件夹路径打开对应...

2025-12-29 13:03 off999

怎么升级到win11(怎么升级到win11专业版)

Windows11可以在「开始菜单-设置-Windows更新」中进行手动更新。如果您想主动更新,需先确保您的电脑符合Windows11的最低系统要求。接着,打开「Windows更...

微信好友误删了怎么加回来(微信好友误删了怎么加回来免费)

看到他的评论的话,你可以去你发过的内容里去看看。<br/><br/>好友验证的消息、语音)或者朋友圈内容:<br/>如果你这个朋友喜欢和你在朋友圈聊天的话,你他的手机号也有的话方法添加里输入就可...

access安装包(access安装包怎么安装)
access安装包(access安装包怎么安装)

要下载并安装MicrosoftAccess,可以按照以下步骤进行操作:1.打开您的电脑的浏览器(如谷歌浏览器、火狐浏览器等)。2.在浏览器的搜索栏中输入"下载MicrosoftAccess"。3.从搜索结果中选择适...

2025-12-29 11:51 off999

取消回复欢迎 发表评论: