2013-10-20 126 views
2

我正在为一些东西写一个类,而且我一直在绊倒同样的烦人的东西来输出构造。是否有一些简单的方法可以设置类,以便构造函数中的所有参数都可以初始化为自己的名称,即fish = 0 -> self.fish = fishpython class关键字参数

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

为什么你需要这样一个奇怪的预先任务? –

+0

那么,为什么你没有在构造函数中将缺省值设置为默认值规范的一部分呢?对于新的海报, –

+3

@ user2799617 - 有时代码格式并不总是显而易见的......它包含一个链接如http://stackoverflow.com/help/formatting,肯定不会有什么伤害,所以他们有资源做试图这样做 –

回答

2

简答:没有。你不需要在构造函数中初始化所有的东西(你可以懒惰地执行它),除非你立即需要或者暴露它(意味着你不控制访问)。但是,由于在Python中没有声明数据字段,因此如果它们出现在代码的不同部分中,将很难跟踪它们。

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

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

+0

这是'** kwargs' –

+0

好吧,这是一个耻辱。是的,出于这个原因,我不想使用** kwargs。谢谢。 – Ashiataka

+0

@JonClements是的,修复。无论如何,为什么要低调? –

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得到棘手,我不能完全得到右边的详细信息。

+0

这样做很糟糕,但是用于回答问题的+1 –