22

我想知道是否有人有任何好的方法来快速解释如何有效地和 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

有一个更好的方法吗?

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

4

3 回答 3

43

您可以设置默认参数:

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

如果您没有使用 and 显式调用该类jk您的实例将使用您在 init 参数中定义的默认值。因此,当您创建此对象的实例时,您可以正常使用所有四个参数:OpticalTransition('sodium', 5, 100, 27)

或者您可以省略带有默认值的参数 OpticalTransition('sodium', 5),这将被解释为OpticalTransition('sodium', 5, None, 0)

通过引用参数的名称,您可以使用一些默认值但不是全部:OpticalTransition('sodium', 5, k=27)使用j's default 但不是k's。

Python 不允许您将其j=i作为默认参数(i不是类定义可以看到的现有对象),因此该行使用实际上执行相同操作self.j的语句来处理此问题。if

于 2013-03-20T22:14:09.903 回答
3

我对stackoverflow太陌生,无法投票或发表评论,但我同意ronak的回答。Gareth Latty 关于默认参数的评论是通过使用 get 方法的 [default] 选项来解决的。

dictionary.get(key[, default])

当有许多可选变量要传递时,使用 **args 允许更少/更易读的代码。它只是将字典键值对作为参数传递。

于 2020-04-26T23:33:14.377 回答
-2

您可以将 args 作为 dict 对象传递并通过 dict 解析以获得您想要的任何内容。如果没有通过,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', self.i)

默认情况下,该get函数将返回None. 因此,如果存在 的值j,则将其分配给 self.j 否则将分配与相同的值i

于 2013-03-20T22:16:22.593 回答