如何将属性传递给自定义数据类

问题描述

我目前正在尝试在 python 中实现一个自写的 Dataclass 包装器/装饰器。 我在传递要在其上使用该装饰器的函数的参数和属性时遇到了很多麻烦。

到现在为止我的思考过程: 装饰器不知道该类有多少属性和参数,但我仍然必须以某种方式访问​​它们。然后我将不得不通过“属性名称访问这些。由于数据类装饰器主要执行 init 所做的(以及可选的 eq 等),因此我必须传递类/实例 dict访问所有参数。我已经尝试在数据模型中的 Pythons 语言参考中找到它,但我找不到。

我将不胜感激任何形式的帮助,无论是在文档中找到答案的地方,还是某种提示或小代码片段。

解决方法

dataclass 装饰器在为类创建默认的 __init__ 实例方法时基本上做了两个步骤:

  1. 它使用类的 __annotations__(参见 PEP 526)属性提取所有类变量,如 docstring of dataclass 中所述。

  2. 它创建一个包含整个函数定义的 string ,以及一个完整的参数列表,从步骤 1 的类变量生成,如果存在它们的默认值。然后它使用 exec 将其作为 Python 代码实际运行,进而生成一个新的 user-defined function object。该新对象最终分配给修饰的 __init__class object 属性。

所以为了修改新创建的 __init__ 函数的参数列表以匹配类变量,dataclass 创建了一个新的函数定义。似乎没有直接的方法可以在函数定义本身之外修改函数对象的参数列表。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...