3

我正在为某事写一门课,但我一直在绊倒同样令人厌烦的打字结构。有没有一些简单的方法可以设置类,以便构造函数中的所有参数都被初始化为它们自己的名称,即fish = 0 -> self.fish = fish

class Example(object):
    def __init__(self, fish=0, birds=0, sheep=0):
        self.fish = fish
        self.birds = birds
        self.sheep = sheep
4

3 回答 3

3

简短的回答:没有。您不需要初始化构造函数中的所有内容(您可以懒惰地进行),除非您立即需要它或公开它(这意味着您不控制访问)。但是,由于在 Python 中您不声明数据字段,因此如果它们出现在代码的不同部分中,跟踪它们将变得非常困难。

更全面的答案:您可以使用(它包含一个参数名称/值对的字典)做一些魔术**kwargs,但这是非常不鼓励的,因为它使记录更改几乎不可能并且用户难以检查某个参数是否被接受或不是。仅将其用于可选的内部标志。当有 20 个或更多参数要传递时,它可能很有用,但在这种情况下,我建议重新考虑设计和集群数据。

如果您需要简单的键/值存储,请考虑使用内置函数,例如dict.

于 2013-10-20T13:34:06.907 回答
3

您可以使用该inspect模块:

import inspect

class Example(object):

    def __init__(self, fish=0, birds=0, sheep=0):
        frame = inspect.currentframe()
        args, _, _, values = inspect.getargvalues(frame)
        for i in args:
            setattr(self, i, values[i])

这可行,但比手动设置更复杂。应该可以用装饰器隐藏它:

@set_attributes
def __init__(self, fish=0, birds=0, sheep=0):
    pass

但是定义set_attributes变得很棘手,因为装饰器将另一个堆栈帧插入到混合中,我不能完全正确地了解细节。

于 2013-10-20T13:56:30.420 回答
3

对于 Python 3.7+,您可以尝试将数据类与类型注释结合使用。

https://docs.python.org/3/library/dataclasses.html

导入模块并使用装饰器。类型注释您的变量,无需定义 init 方法,因为它会自动为您创建。

from dataclasses import dataclass

@dataclass
class Example:
    fish: int = 0
    birds: int = 0
    sheep: int = 0
于 2019-06-28T19:54:04.063 回答