python类关键字参数

时间:2013-10-20 13:29:46

标签: python

我正在写一个类的东西,我仍然磕磕绊绊地穿着同样的烦恼来打字施工。是否有一些简单的方法可以设置类,以便构造函数中的所有参数都被初始化为自己的名称,即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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

您可以使用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会变得棘手,因为装饰器会在混合中插入另一个堆栈帧,而我无法完全了解详细信息。

答案 2 :(得分:1)

对于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