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