0

0

获取类中所有声明或类型化的参数

DDD

DDD

发布时间:2025-06-30 21:42:01

|

600人浏览过

|

来源于php中文网

原创

获取类中所有声明或类型化的参数

本文旨在提供一种使用 Python 反射机制获取类及其父类中所有声明或类型化的参数的方法。通过结合 inspect.get_annotations 和类的 __mro__ 属性,我们可以提取包括父类在内的所有类型注解,并将其组织成一个易于使用的字典。本文提供详细的代码示例和解释,帮助读者理解和应用这一技术。

使用 inspect.get_annotations 和 __mro__ 获取参数类型信息

Python 的 inspect 模块提供了强大的反射功能,其中 inspect.get_annotations 函数可以获取指定对象的类型注解。类的 __mro__ 属性则包含了类的继承关系,即方法解析顺序(Method Resolution Order)。结合这两个工具,我们可以遍历类的继承链,提取所有父类的类型注解。

以下是一个示例代码:

import inspect
from typing import Any, Optional, Dict

class Parent:
    parent_param: str
    parent_default: Optional[str] = None

    @classmethod
    def find_params_meta(cls) -> Dict[str, Any]:
        params_meta = {}
        for c in reversed(cls.__mro__):
            if hasattr(c, '__annotations__'):
                for k, v in inspect.get_annotations(c).items():
                    if k not in params_meta: # 避免子类覆盖父类同名参数的类型信息
                        params_meta[k] = {"types": [v]}
                        if hasattr(cls, k) and getattr(cls, k) != inspect._empty:
                            params_meta[k]["default"] = getattr(cls, k)
        return params_meta


class Child(Parent):
    child_param: str
    _params_meta: Optional[Dict[str, Any]] = None

    def __init__(self, parent_param: str, child_param: str):
        self._params_meta = self.find_params_meta()
        self.child_param = child_param
        self.parent_param = parent_param

    def __getattr__(self, name):
        # 模拟未初始化的属性访问
        raise AttributeError(f"'{type(self).__name__}' object has no attribute '{name}'")

# 实例化对象并打印结果
child_instance = Child("parent param", "child param")
print(child_instance._params_meta)

# 断言
expected_result = {
    "parent_param": {"types": [str]},
    "parent_default": {"types": [str, type(None)], "default": None},
    "child_param": {"types": [str]},
}

assert child_instance._params_meta == expected_result

代码解释:

佳蓝智能应答系统
佳蓝智能应答系统

类似智能机器人程序,以聊天对话框的界面显示,通过输入问题、或点击交谈记录中的超链接进行查询,从而获取访客需要了解的资料等信息。系统自动保留用户访问信息及操作记录。后台有详细的设置和查询模块。适用领域:无人职守的客服系统自助问答系统智能机器人开发文档、资源管理系统……基本功能:设置对话界面的显示参数设置各类展示广告根据来访次数显示不同的欢迎词整合其他程序。

下载
  1. Parent 类和 Child 类: 定义了父类 Parent 和子类 Child,包含类型注解的类属性。
  2. find_params_meta 方法: 这是一个类方法,用于获取类及其父类的类型注解。
  3. cls.__mro__: __mro__ 属性返回一个包含类及其所有父类的元组,按照方法解析顺序排列。 使用 reversed 反转这个顺序,确保子类的类型信息优先。
  4. inspect.get_annotations(c): 获取每个类 c 的类型注解,返回一个字典。
  5. 类型信息合并: 遍历父类链时,将父类的类型信息合并到 params_meta 中。如果子类定义了与父类同名的参数,则子类的类型信息优先。
  6. 默认值获取: 检查类属性是否有默认值,如果有则添加到结果字典中。
  7. __getattr__ 方法: 为了模拟问题描述中“未实例化属性”的场景,重写了 __getattr__ 方法,当访问不存在的属性时抛出 AttributeError。

运行结果:

{'parent_param': {'types': []}, 'parent_default': {'types': [, ], 'default': None}, 'child_param': {'types': []}

注意事项

  • 类型覆盖: 在继承关系中,如果子类重新定义了父类的属性,并且类型注解不同,则子类的类型注解会覆盖父类的类型注解。
  • 性能: 使用反射可能会影响性能,特别是在频繁调用的场景中。 可以考虑缓存结果以提高性能。
  • 兼容性: inspect.get_annotations 是 Python 3.9 引入的,如果需要兼容更早的版本,可以使用 typing.get_type_hints。

总结

通过结合 inspect.get_annotations 和 __mro__ 属性,我们可以方便地获取类及其父类的类型注解。这对于实现一些通用的工具函数,例如自动生成 API 文档、参数校验等非常有用。 在实际应用中,需要注意类型覆盖、性能和兼容性等问题。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

707

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

625

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

734

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

616

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1234

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

573

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

695

2023.08.11

笔记本电脑卡反应很慢处理方法汇总
笔记本电脑卡反应很慢处理方法汇总

本专题整合了笔记本电脑卡反应慢解决方法,阅读专题下面的文章了解更多详细内容。

1

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 2.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号