__init__ 是否有一个 Python 快捷方式,它只是设置属性?

Is there a Python shortcut for an __init__ that simply sets properties?

在 Python 中有时会经常看到 __init__ 代码如下:

class SomeClass(object):
    def __init__(self, a, b, c, d, e, f, g):
        self.a = a
        self.b = b
        self.c = c
        self.d = d
        self.e = e
        self.f = f
        self.g = g

特别是如果所讨论的 class 纯粹是一个没有行为的数据结构。是否有 (Python 2.7) 的快捷方式或制作方法?

您可以使用 Alex Martelli 的 Bunch recipe:

class Bunch(object):
    """
    foo=Bunch(a=1,b=2)
    """
    def __init__(self, **kwds):
        self.__dict__.update(kwds)

您可以使用 __new__ 方法创建 class,该方法将任何 class 属性复制到对象,然后从中继承。

http://www.oreilly.com/programming/free/how-to-make-mistakes-in-python.csp 有一个例子说明为什么我刚才说的是一个应该避免的糟糕想法。

(简短版本:它不能很好地处理可变对象,处理它的变通方法不值得付出努力。)

当然可以。

Class SomeClass(object):
    def __init__(self, **args):
        for(k, v) in args.items():
            setattr(self, k, v)

v = SomeClass(a=1, b=2, c=3, d=4)

错误会使您的代码难以理解。

祝你好运。

您可能会发现 attrs 库很有帮助。这是来自文档 overview page 的示例:

>>> import attr
>>> @attr.s
... class SomeClass(object):
...     a_number = attr.ib(default=42)
...     list_of_numbers = attr.ib(factory=list)
...
...     def hard_math(self, another_number):
...         return self.a_number + sum(self.list_of_numbers) * another_number
>>> sc = SomeClass(1, [1, 2, 3])
>>> sc
SomeClass(a_number=1, list_of_numbers=[1, 2, 3])
>>> sc.hard_math(3)
19

如果您使用的是 Python 3.8+,则可以使用 dataclasses

>>> from typing import List
>>> from dataclasses import dataclass, field
>>> @dataclass
... class OtherClass:
...     a_number: int=42
...     list_of_numbers: List[int] = field(default_factory=list)
...     def hard_math(self, another_number):
...         return self.a_number + sum(self.list_of_numbers) * another_number
>>> OtherClass=SomeClass
>>> oc = OtherClass(1, [1, 2, 3])
>>> oc
SomeClass(a_number=1, list_of_numbers=[1, 2, 3])
>>> oc.hard_math(3)
19