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