Python でサブクラスを作成するときの使用法*args
と使用法を理解しようとしています。**kwds
このコードがこのように動作する理由を理解したいと思います。の呼び出しで and を*args
省略すると、奇妙な引数のアンパックが発生します。**kwds
super().__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 サブクラスのインスタンスを作成すると、興味深い「引数のアンパック」が得られます。args
kwds
*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 s1
and s2
,はand orがキーワード引数であると__init__
想定し、 を dict に設定するのでしょうか?moves = True
num_legs = 0
1
num_legs
ではs3
、両方の変数をタプルとしてmoves
(クラス内の) にアンパックします。Animal
引数のアンパッキングを理解しようとしていたときに、これに出くわしました。前もって申し訳ありませんが、この質問をより適切に組み立てる方法がわかりません。