11

Python でサブクラスを作成するときの使用法*argsと使用法を理解しようとしています。**kwds

このコードがこのように動作する理由を理解したいと思います。の呼び出しで and を*args省略すると、奇妙な引数のアンパックが発生します。**kwdssuper().__init__

これが私のテストケースです:

class Animal(object):
    def __init__(self, moves, num_legs):
        self.moves = moves
        self.num_legs = num_legs

    def describe(self):
        print "Moves :{} , num_legs : {}".format(self.moves, self.num_legs)

class Snake(Animal):
    def __init__(self, poisonous, *args, **kwds):
        self.poisonous = poisonous
        print "I am poisonous:{}".format(self.poisonous)
        # This next line is key. You have to use *args , **kwds.
        # But here I have deliberately used the incorrect form,
        # `args` and `kwds`, and am suprised at what it does.
        super(Snake, self).__init__(args, kwds)

ここで、( andの代わりにandsuper(…).__init__を使用する)への誤った呼び出しを含む Snake サブクラスのインスタンスを作成すると、興味深い「引数のアンパック」が得られます。argskwds*args**kwds

s1 = Snake(False, moves=True, num_legs=0)
s2 = Snake(poisonous=False, moves=True, num_legs=1)
s3 = Snake(False, True, 3)
s1.describe()
s2.describe()
s3.describe()

私が得るものは次のとおりです。

Moves :() , num_legs : {'moves': True, 'num_legs': 0}
Moves :() , num_legs : {'moves': True, 'num_legs': 1}
Moves :(True, 3) , num_legs : {}

では、なぜ in s1and s2,はand orがキーワード引数であると__init__想定し、 を dict に設定するのでしょうか?moves = Truenum_legs = 01num_legs

ではs3、両方の変数をタプルとしてmoves(クラス内の) にアンパックします。Animal


引数のアンパッキングを理解しようとしていたときに、これに出くわしました。前もって申し訳ありませんが、この質問をより適切に組み立てる方法がわかりません。

4

3 に答える 3