3
class Pen(object):
    def __init__(self, mean_radius = None, length = None):
        self.usage = "Is used to apply ink trails to drawing surfaces"
        self.mean_radius = mean_radius
        self.length = length

class FountainPen(Pen):
    def __init__(self, manufacturer = "Waterman", *args, **kwargs):
        Pen.__init__(self, *args, **kwargs)
        self.manufacturer = manufacturer
        self.cartridge_state =  "non-empty"

>>> instance_FP = FountainPen(5, 1)
>>> instance_FP.mean_radius
>>> print instance_FP.mean_radius
1    
>>> print instance_FP.length
None

5のインスタンス化で引数として渡される整数はどうなりますFountainPenか?なぜprint instance_FP.mean_radius戻っ1てこないの5ですか?

4

4 に答える 4

6

あなたはそれをそのように考える必要があります:*argsそして**kwargsそれらの前にある「通常の」引数によって残されたすべての位置/キーワード引数を「食べる」。あなたがそれらを最後に置くならば、彼らは「通常の議論」に適合できなかったものだけを得るでしょう。

だから、あなたがFountainPen(5,1)何が起こるかを書くとき、それFountainPen.__init__はこのように呼ばれます:

  • self新しく作成されたインスタンスに設定されます。
  • manufacturer5である最初の引数を取得します。
  • *args残りのすべての位置引数を「食べる」、つまり1; したがって、は;argsに設定されます。[1]
  • *kwargs残っているキーワード引数を食べますが、何もないので、になり{}ます。

次に、引数として(以外に)呼び出され、デフォルト値()に設定されたままであることPen.__init__は明らかです。1selflengthNone

于 2012-06-24T12:02:02.683 に答える
2

Matteo Italiaの言及は何が悪いのか、基本的にmanufacturerは位置的な議論です。を少し変更して次FountainPenのように修正できます。__init__

def __init__(self, *args, manufacturer = "Waterman", **kwargs):

これを行うmanufacturerとキーワード引数が作成されるため、変更するには次のコマンドを呼び出す必要があります。

FountainPen(manufacturer="newval")

注:残念ながら、この構文(*argsパラメーターの後にキーワードのみの引数がある)はPython 3でのみ有効です。JonClementsには、 Python2のこの問題を解決するソリューションがあります。

于 2012-06-24T12:06:16.877 に答える
2

よりエレガントな解決策は次のとおりです。

class FountainPen(Pen):
    def __init__(self, *args, **kwargs):
        Pen.__init__(self, *args, **kwargs)
        self.manufacturer = kwargs.get('manufacturer', 'Waterman')
        self.cartridge_state =  "non-empty"

blah = FountainPen(5, 1, manufacturer='Waterman')
于 2012-06-24T12:07:47.093 に答える
0

コードでは、5が引数に割り当てられ、manufacturer1がに割り当てられます*args

キーなしで引数を関数に渡すときは、最初に明示的な引数を指定する必要があります。残りは*argsに渡されます。これを回避するには、コンストラクターを呼び出すときにキーワードを指定します。

>>> instance_FP = FountainPen(mean_radius=5, length=1)
于 2012-06-24T12:01:42.367 に答える