如何获取 class 对象的属性类型而不在 python 中对其进行初始化

How to get types of attributes of a class object without initializing it in python

前信息

我们在多台机器上有一个结构 运行,这些机器通过使用我们的 json 可序列化对象在设备之间传输数据来相互通信。

我正在尝试使用 markdown 为这些 类 创建文档。

问题


class BaseParams(JsonObject):
    """ default values for all classes"""

    def __init__(self):
        self.param0: str = "test"


class ExampleParams(BaseParams):
    """ example class for data container"""

    def __init__(self, param1: str):
        super().__init__()
        self.param1: str = param1
        self.param2: int = 0

我在一个 py 文件中有很多 类 比如 ExampleParams。我在 inspectimportlib 模块的帮助下动态收集了它们、它们的文档等,但我还必须收集它们的参数和参数类型。

试图得到类似的东西:

resultdict = {
    "ExampleParams":{"param0":"str","param1":"str","param2":"int"}
}

我如何在不初始化 类 的情况下做到这一点?

PS1: 当我初始化它们时很容易,但是有很多 类 并且每个都有不同的初始化值。所以我想我必须在不初始化它们的情况下这样做。

PS2: 每个属性的类型都通过键入 module

声明

没有初始化的局部参数,如 param0param2not evaluated,所以 Python 解释器没有关于它们存在或类型的信息。

您唯一的可能就是收集 __init__ 方法的参数。使用您的示例结构:

import inspect

params = []
for parent in ExampleParams.mro()[::-1]:
    parent_init = inspect.getfullargspec(parent.__init__)
    # parent_init.annotations contains annotations if specified in method signature
    for param in parent_init.args:
        if param == 'self':
            continue
        params.append(param)

params = ['param1'] 你的情况。