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

jとを使用してクラスを明示的に呼び出さない場合k、インスタンスは init パラメータで定義したデフォルトを使用します。したがって、このオブジェクトのインスタンスを作成するときは、通常どおり 4 つのパラメーターすべてを使用できます。OpticalTransition('sodium', 5, 100, 27)

OpticalTransition('sodium', 5)または、次のように解釈されるデフォルトのパラメータを省略できます。 OpticalTransition('sodium', 5, None, 0)

OpticalTransition('sodium', 5, k=27)パラメータの名前を参照することで、いくつかのデフォルト値を使用できますが、すべてではありjませんk

Python ではj=i、デフォルト パラメーターとして実行することはできませiん ( は、クラス定義が参照できる既存のオブジェクトではありません)。そのため、この行では、実際には同じことself.jを行うステートメントでこれを処理します。if

于 2013-03-20T22:14:09.903 に答える
3

私はスタックオーバーフローで賛成票を投じたりコメントしたりするには新しすぎますが、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 に答える