如何获取 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。我在 inspect 和 importlib 模块的帮助下动态收集了它们、它们的文档等,但我还必须收集它们的参数和参数类型。
试图得到类似的东西:
resultdict = {
"ExampleParams":{"param0":"str","param1":"str","param2":"int"}
}
我如何在不初始化 类 的情况下做到这一点??
PS1: 当我初始化它们时很容易,但是有很多 类 并且每个都有不同的初始化值。所以我想我必须在不初始化它们的情况下这样做。
PS2: 每个属性的类型都通过键入 module
声明
没有初始化的局部参数,如 param0
和 param2
是 not 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']
你的情况。
前信息
我们在多台机器上有一个结构 运行,这些机器通过使用我们的 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。我在 inspect 和 importlib 模块的帮助下动态收集了它们、它们的文档等,但我还必须收集它们的参数和参数类型。
试图得到类似的东西:
resultdict = {
"ExampleParams":{"param0":"str","param1":"str","param2":"int"}
}
我如何在不初始化 类 的情况下做到这一点??
PS1: 当我初始化它们时很容易,但是有很多 类 并且每个都有不同的初始化值。所以我想我必须在不初始化它们的情况下这样做。
PS2: 每个属性的类型都通过键入 module
声明没有初始化的局部参数,如 param0
和 param2
是 not 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']
你的情况。