mmi*_*ate 5 python constructor code-generation data-members
我有无数来自 SQLAlchemy 的各种项目的 Python 类(还有一些来自 Pygame 的项目),我最近注意到其中许多项目中的一个模式:它们的构造函数总是这样:
class Foo(Base):
def __init__(self, first, last, email, mi=""):
self.first = first
self.last = last
self.email = email
self.mi = mi
Run Code Online (Sandbox Code Playgroud)
...由此构造函数所做的唯一一件事就是将一组位置参数传输到一组完全相同命名的数据成员中,不执行任何计算或其他函数调用。
在我看来,这种重复是不必要的,并且在更改时容易出现人为错误。
这让我想到了一个问题:是否可以自动生成这样的__init__(self, ...)
函数,最好不要乱用 CPython 字节码或使用模板/宏来改变源文件本身?
对于 python >= 3.7,处理此问题的正确方法是通过dataclasses
:
该模块提供了一个装饰器和函数,用于自动将生成的特殊方法(例如
__init__()
和 )__repr__()
添加到用户定义的类中。它最初是在 PEP 557 中描述的。