使用默认值初始化方法的参数

时间:2012-10-25 18:37:47

标签: python

如果未将明确的值传递给方法,我想用一些默认值初始化方法的参数 - 如下所示:

class Example
   def __init__(self, data = self.default_data()):
      self.data = data

   def default_data():
      # ....
      return something

我收到了错误:

NameError: name 'self' is not defined

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:23)

这里常见的习惯用法是将默认值设置为某个标记值(None是典型的,尽管some have suggested Ellipsis用于此目的),然后您可以检查。

class Example(object): #inherit from object.  It's just a good idea.
   def __init__(self, data = None):
      self.data = self.default_data() if data is None else data

   def default_data(self):  #probably need `self` here, unless this is a @staticmethod ...
      # ....
      return something

您可能还会看到object()的实例用于哨兵。

SENTINEL = object()
class Example(object):
   def __init__(self, data = SENTINEL):
      self.data = self.default_data() if data is SENTINEL else data

后一版本的好处是您可以将None传递给您的函数,但有一些缺点(请参阅下面的@larsmans的评论)。如果您不认为需要将None作为有意义的参数传递给您的方法,我会主张使用它。