17

明示的な値がメソッドに渡されなかった場合、メソッドのパラメーターをデフォルト値で初期化したいと思います-次のようなものです:

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

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

エラーが発生しました:

NameError: name 'self' is not defined

これを修正するにはどうすればよいですか?

4

1 に答える 1

23

ここでの一般的なイディオムは、デフォルトをいくつかのセンチネル値に設定することです (これNoneは一般的ですが、この目的のために提案されているものもあります)。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メソッドに意味のある引数として渡す必要がないと思われる場合は、それを使用することをお勧めします。

于 2012-10-25T18:40:28.143 に答える