python - 如何避免 __init__ 中的 "self.x = x; self.y = y; self.z = z"模式?

标签 python python-dataclasses namedtuple python-attrs

我看到类似的模式

def __init__(self, x, y, z):
    ...
    self.x = x
    self.y = y
    self.z = z
    ...

非常频繁,通常带有更多参数。有没有避免这种乏味重复的好方法?类是否应该从 namedtuple 继承?

最佳答案

免责声明:似乎有几个人关心提出这个解决方案,所以我将提供一个非常明确的免责声明。您不应使用此解决方案。我仅将其作为信息提供,因此您知道该语言可以做到这一点。剩下的答案只是展示语言能力,而不是支持以这种方式使用它们。


将参数显式复制到属性中并没有什么问题。如果 ctor 中有太多参数,有时会被认为是代码异味,也许您应该将这些参数分组到更少的对象中。其他时候,这是必要的,没有任何问题。 无论如何,明确地这样做是要走的路。

但是,既然您问的是如何完成(而不是是否应该完成),那么一种解决方案是:

class A:
    def __init__(self, **kwargs):
        for key in kwargs:
          setattr(self, key, kwargs[key])

a = A(l=1, d=2)
a.l # will return 1
a.d # will return 2

关于python - 如何避免 __init__ 中的 "self.x = x; self.y = y; self.z = z"模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35190877/

相关文章:

python - 在 while 循环中重置 raw_input (python)

python - 从 Python 数据类装饰器中的 __repr__ 方法中删除引号

python - 在 Python3 中使用类型提示初始化 Optional Dict 的正确方法?

python - 将文档字符串添加到命名元组?

python - 删除 Jupyter Notebook 中的 plotly 子图中的 "This is the format of your plot grid:"

python - Django 的管理命令如何管理事务?

Python如何访问数据类列表中的数据类属性

python - 从其他模块访问 python nametuple _fields

Python:作为 namedtuple 对象的 Lambda 函数?

python - 在 python 中使用字符串输入数组重写多个附加替换方法的更好方法?