当前位置: 首页 > news >正文

@runtime_checkable 装饰器

@runtime_checkable 是 Python 的 typing 模块中的一个装饰器,用于结合 Protocol 类型,允许在运行时检查一个对象是否符合某个协议(Protocol)。它扩展了 isinstance()issubclass() 的功能,使得基于结构子类型(structural subtyping)的类型检查在运行时成为可能。


基本用法

  1. 导入装饰器

    from typing import runtime_checkable, Protocol
    
  2. 定义协议
    使用 Protocol 定义一个接口,并用 @runtime_checkable 装饰它。协议中需要声明对象必须包含的方法或属性。

    @runtime_checkable
    class SupportsClose(Protocol):
        def close(self) -> None:
            ...
    
  3. 实现类
    定义一个类,无需显式继承协议,只需实现协议中定义的方法/属性:

    class File:
        def close(self) -> None:
            print("File closed")
    
    class NetworkConnection:
        def disconnect(self) -> None:
            print("Disconnected")
    
  4. 运行时检查
    使用 isinstance() 检查对象是否符合协议:

    file = File()
    conn = NetworkConnection()
    
    print(isinstance(file, SupportsClose))  # 输出 True
    print(isinstance(conn, SupportsClose))  # 输出 False
    

关键点

  1. 结构子类型检查

    • @runtime_checkable 检查对象是否拥有协议中声明的所有方法和属性(按名称检查)。
    • 不关心继承关系,只要结构匹配即可。
  2. 仅检查存在性

    • 不会检查方法签名(参数类型、返回值类型等)。
    • 例如,协议中的方法如果有参数,但实现的方法没有参数,检查仍会通过,但调用时可能出错。
  3. 性能注意

    • 运行时检查可能影响性能,谨慎在高频代码中使用。

示例:检查属性

from typing import Protocol, runtime_checkable

@runtime_checkable
class HasName(Protocol):
    name: str  # 检查是否存在 name 属性(类型不强制)

class Person:
    def __init__(self, name: str):
        self.name = name

class Dog:
    def __init__(self):
        self.name = "Buddy"

class Car:
    def __init__(self, model: str):
        self.model = model  # 属性名不匹配

person = Person("Alice")
dog = Dog()
car = Car("Tesla")

print(isinstance(person, HasName))  # True
print(isinstance(dog, HasName))    # True
print(isinstance(car, HasName))     # False
True
True
False

常见问题

  1. 为什么 isinstance 返回 False

    • 确保协议被 @runtime_checkable 装饰。
    • 检查对象是否确实实现了协议的所有方法和属性(名称一致)。
  2. abc.ABC 的区别?

    • abc.ABC 基于继承(名义子类型),要求显式继承。
    • @runtime_checkable 基于结构子类型,无需继承。

通过 @runtime_checkable,你可以实现灵活的运行时接口检查,适用于插件系统、动态验证等场景。

相关文章:

  • Android WindowContainer窗口结构
  • 基于springboot 以及vue前后端分离架构的求职招聘系统设计与实现
  • TCP文件传输
  • 开发一个音响控制板程序,需要从硬件架构设计、通信协议选择、核心功能实现三个层面进行系统化开发。以下是基于工业级开发流程的实施方案
  • python-leetcode-加一
  • 【vscode】VScode Remote SSH配置
  • WPF学习笔记
  • Vue 3 30天精进之旅:Day 24 - 国际化支持
  • 如何查看 Linux 服务器的 MAC 地址:深入解析与实践指南
  • JavaScript设计模式 -- 外观模式
  • 【学习资源】时间序列数据分析方法(1)
  • Dify - 创建 RAG Workflow 及 Restful HTTP 请求
  • windows第十章 数值型关联变量和控件型关联变量
  • DeepSeek-R1论文阅读及本地调用
  • 深入理解JVM的运行时数据区
  • 【鸿蒙开发】第三十六章 状态管理 - V1V2混用和迁移指导
  • 清影2.0(AI视频生成)技术浅析(二):自然语言处理
  • Next.js【详解】获取数据(访问接口)
  • 什么是高亮环形光源
  • Vue2/Vue3分别如何使用computed
  • 网站建设培训学费/凡科网站登录入口
  • 怎么查看网站的备案号/今日热搜榜排名
  • 做自己的网站如何赚钱的/国际新闻最新消息美国
  • 网站建设官方网站/企业推广软件
  • 正常做一个网站多少钱/首页关键词优化价格
  • 泰安网络软件公司/安徽网站seo