-3

ここでは、この種の問題について多くの議論がありますが、そのような機能を実装する方法については何も見ていません。

内部Foo()に関数を持つクラスがあるとします。bar()

この関数bar()は、引数を取らないか、引数を 1 つだけ取ります。何も取り込まない場合、属性は 2 に設定されます。それ以外の場合は、入力が何であれ設定されます。すなわち

In [32]: foo = Foo()
In [33]: foo.bar()
In [34]: foo.a
Out [34]: 2

In [32]: foo = Foo()
In [33]: foo.bar(5)
In [34]: foo.a
Out [34]: 5

どうすればいいですか?

4

2 に答える 2

6

キーワード引数を追加します:

def bar(self, value=2):
    self.a = value

ここでは、明示的に指定されていない場合valueのデフォルトは次のとおりです。2

>>> foo = Foo()
>>> foo.bar()
>>> foo.a
2
>>> foo.bar(5)
>>> foo.a
5

関数シグネチャは一度だけ作成されることに注意してください。デフォルトは関数オブジェクトに保存されます。よくある間違いは、関数を呼び出すたびにデフォルトが評価されると思い込んでしまうことです。

import datetime

def ham(now=datetime.datetime.now()):
    print now

ここでは、インポートされ、Python が関数オブジェクトを作成nowした瞬間に修正されます。bar

>>> ham()
2013-10-24 10:20:26.024775
>>> # wait some time
...
>>> ham()
2013-10-24 10:20:26.024775

デフォルト値が変更可能である場合、さらに驚くべきことになります。

def eggs(param, value=[]):
    value.append(param)
    print value

繰り返し呼び出すeggs(2)と、valueリストが大きくなり、2呼び出すたびに新しい値がリストに追加されます。

>>> eggs(2)
[2]
>>> eggs(2)
[2, 2]
>>> eggs(2)
[2, 2, 2]

これについてのより長い議論については、「最小の驚き」と可変デフォルト引数を参照してください。

于 2013-10-24T09:04:55.070 に答える
0

パラメータにデフォルト値を与えることができます。キーワード引数として定義するだけです:

def bar(self, param=2):
    self.a = param

お役に立てれば!

于 2013-10-24T09:05:00.173 に答える