问题描述
我目前正在尝试在 python 中实现一个自写的 Dataclass 包装器/装饰器。 我在传递要在其上使用该装饰器的函数的参数和属性时遇到了很多麻烦。
到现在为止我的思考过程: 装饰器不知道该类有多少属性和参数,但我仍然必须以某种方式访问它们。然后我将不得不通过“属性”名称访问这些。由于数据类装饰器主要执行 init 所做的(以及可选的 eq 等),因此我必须传递类/实例 dict访问所有参数。我已经尝试在数据模型中的 Pythons 语言参考中找到它,但我找不到。
我将不胜感激任何形式的帮助,无论是在文档中找到答案的地方,还是某种提示或小代码片段。
解决方法
dataclass
装饰器在为类创建默认的 __init__
实例方法时基本上做了两个步骤:
-
它使用类的
__annotations__
(参见 PEP 526)属性提取所有类变量,如 docstring of dataclass 中所述。 -
它创建一个包含整个函数定义的
string
,以及一个完整的参数列表,从步骤 1 的类变量生成,如果存在它们的默认值。然后它使用exec
将其作为 Python 代码实际运行,进而生成一个新的user-defined function object
。该新对象最终分配给修饰的__init__
的class object
属性。
所以为了修改新创建的 __init__
函数的参数列表以匹配类变量,dataclass
创建了一个新的函数定义。似乎没有直接的方法可以在函数定义本身之外修改函数对象的参数列表。