python类的初始化程序中的可选参数

问题描述:

我想知道是否有人有任何快速解释如何有效地和pythonically用可选参数创建用户定义的对象的好方法。 举例来说,我想创建该对象:python类的初始化程序中的可选参数

class Object: 
    def __init__(self, some_other_object, i, *j, *k): 
     self.some_other_object = some_other_object 
     self.i = i 
     # If j is specified, assume it is = i 
     if(j==None): 
      self.j = i 
     else: 
      self.j = j 
     # If k is given, assume 0 
     if(k==None): 
      self.k = 0 
     else: 
      self.k = k 

有没有更好的方式来做到这一点?

编辑:我改变了代码,使它更广泛,更容易理解。

+1

这是无效的,你不能有多个'*'参数。以'*'为前缀的参数成为所有非关键字参数的*列表* *。 – 2013-03-20 22:12:48

+0

感谢@Lattyware,这有助于。我看到* args和* keywordsargs等,并认为它们可能指的是通过了不同的参数。 – chase 2013-03-20 22:17:20

+0

毒素的答案是你想要的,它只是有一个主要缺陷(见我对它的评论)。 – 2013-03-20 22:17:52

您可以设置默认参数:

class OpticalTransition(object): 
    def __init__(self, chemical, i, j=None, k=0) 
     self.chemical = chemical 
     self.i = i 
     self.k = k 
     self.j = j if j is not None else i 

如果不显式调用类jk,它会使用这些默认值。

创建对象时,可以使用全部四个参数:OpticalTransition('sodium', 5, 100, 27)。如果要使用j的默认值,但不使用k,则仍可以通过引用参数名称OpticalTransition('sodium', 5, k=27)来完成此操作。

+2

*一般来说,不要担心,如果x == None,只是如果x。*是不好的建议。许多值可以计算为“False” - 如果你想检查'None',则执行'如果x是None:',而不是'if x:'。在这个例子中,如果'j'为'0',它会做出意想不到的事情。 -1,直到这是固定的。 – 2013-03-20 22:14:48

+0

你说得对 - 我想OP是这么做的,看看它是否存在,不一定要看它们是否具有“无”的价值。 – toxotes 2013-03-20 22:18:20

+0

解决这个问题,我会将其翻转+1,这是除此之外可能的最佳答案。 (编辑:我自己编辑)。 – 2013-03-20 22:18:57

你可以传递args作为一个字典对象,并通过字典来解析,以得到你想要的。如果它没有通过,get函数将返回None并且可以像那样检查存在。

class Optioncal_transition(object): 
    def __init(self, **args): 
    self.chemical = args.get('chemical') 
    self.i = args.get('i') 
    self.j = args.get('j') 
    if self.j is None: 
     self.j = self.i 
+1

这大大地重塑了车轮 - 存在默认参数。 -1。这只会让你的代码变得不可读。 – 2013-03-20 22:16:55