【问题标题】:Make __init__ variables into attributes automatically使 __init__ 变量自动成为属性
【发布时间】:2021-02-16 18:42:19
【问题描述】:

我有一堂课如下:

class Sample:

    def __init__(self, var1, var2, var3, ...):

        self.var1 = var1
        self.var2 = var2
        self.var3 = var3
        ...

除了我有超过 10 个变量,我想成为可以在调用类时更改的属性。它似乎过于冗长。有什么办法可以缩写吗?我正在设想一些简洁的东西

class Sample:

    def __init__(self, *var1, *var2, var3, ...):

        ...

然后变量var1var2 将自动成为属性self.var1self.var2。有没有这样的事情,或者我需要像上面的第一块代码那样做吗?

【问题讨论】:

  • 您可以使用数据类。

标签: python class variables attributes


【解决方案1】:

您的班级可能在做不止一件事(不好的 OO),或者要统一对待属性。在这种情况下,您可以显式使用字典:

class Sample:
    def __init__(self, **kwargs):
        self.data = dict(kwargs)

或者数据类,如果您关心名称验证,如 cmets 中所建议的那样:

from dataclasses import dataclass

@dataclass
class Sample:
    var1: str
    var2: float
    ...

【讨论】:

  • “或者一个数据类,如果你关心名称和类型验证”数据类不做任何类型验证
【解决方案2】:

Martelli 的经典Python Cookbook 秘诀永远存在:

class Bunch:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)


foo = Bunch(a=13, b=42)
print(f'{foo.a=}') # -> foo.a=13
print(f'{foo.b=}') # -> foo.b=42

现在,dataclasses 会是更好的选择。

建议您在 YouTube 上观看 Raymond Hettinger 的 Dataclasses: The code generator to end all code generators 谈话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2011-11-26
    • 2016-08-24
    • 2012-02-09
    • 1970-01-01
    • 2014-08-25
    • 2021-06-11
    相关资源
    最近更新 更多