1. ホーム
  2. パイソン

[解決済み】Pythonで複数のコンストラクタを持つためのクリーンでPythonicな方法は何ですか?

2022-03-23 13:08:59

質問

明確な答えが見つからないのですが。私の知る限りでは、複数の __init__ 関数は、Pythonのクラス内にあります。では、どうすればこの問題を解決できるのでしょうか?

というクラスがあるとします。 Cheese を使用し number_of_holes プロパティを使用します。チーズ・オブジェクトを作成する方法を2つ持つにはどうしたらいいでしょうか...。

  1. このように穴の数を取るもの。 parmesan = Cheese(num_holes = 15)
  2. そして、引数を取らず、ただランダムに number_of_holes プロパティを指定します。 gouda = Cheese()

一つの方法しか思いつきませんが、これは不格好な感じがします。

class Cheese():
    def __init__(self, num_holes = 0):
        if (num_holes == 0):
            # Randomize number_of_holes
        else:
            number_of_holes = num_holes

なんて言うんだ?他に方法はないのでしょうか?

解決方法は?

実は None は、quot;magic" 値のためにはるかに優れています。

class Cheese():
    def __init__(self, num_holes = None):
        if num_holes is None:
            ...

さて、もっと自由にパラメータを追加したい場合。

class Cheese():
    def __init__(self, *args, **kwargs):
        #args -- tuple of anonymous arguments
        #kwargs -- dictionary of named arguments
        self.num_holes = kwargs.get('num_holes',random_holes())

の概念をよりよく説明するために *args**kwargs (実際にはこれらの名前を変更することができます)。

def f(*args, **kwargs):
   print 'args: ', args, ' kwargs: ', kwargs

>>> f('a')
args:  ('a',)  kwargs:  {}
>>> f(ar='a')
args:  ()  kwargs:  {'ar': 'a'}
>>> f(1,2,param=3)
args:  (1, 2)  kwargs:  {'param': 3}

http://docs.python.org/reference/expressions.html#calls