2016-06-15 8 views
0

このコードで試したように、継承階層でargsとkwargsの両方を管理する方法はありますか? 「);」予想:Pythonの継承階層でargsとkwargsの両方を管理する

class Parent(object): 
    def __init__(self, motherArg1, motherArg2=100): 
     self.motherArg1 = motherArg1 
     self.motherArg2 = motherArg2 
    def printParent(self): 
     print self.motherArg1 
     print self.motherArg2 

class Child(Parent): 
    def __init__(self, childArg1, *args, childArg2=100, **kwargs): # Doesn't work here 
     super(Child, self).__init__(*args, **kwargs) 
     self.childArg1 = childArg1 
     self.childArg2 = childArg2 
    def printChild(self): 
     print self.childArg1 
     print self.childArg2 

child = Child(1, 3, childArg2=2, motherArg2=4) 
child.printChild() 
child.printParent() 

構文は良くありません。私は1 2 3 4を表示するようになっている

... kwargsからか、このような何かで指定されたキーを持つ値を取得することなく、意味しますafter * args。

def __init__(self, childArg1, childArg2=100, *args, **kwargs)は正しい構文ですが動作しません。

  1. 私はこの構文を試してみてchild = Child(1, childArg2=2, 3, motherArg2=4)とき、私はでSyntaxErrorを取得:キーワード引数
  2. 後に非キーワード引数を私はchild = Child(1, 3, childArg2=2, motherArg2=4)をしようとすると、私はTypeError例外を取得:__init __()はキーワード引数 'の複数の値を得ましたchildArg2'
+1

適切に書式設定された*を質問に含めるには[編集]してください*。この場合、どの出力を得るのかははっきりしていますが、[mcve]は良い習慣です。 – jonrsharpe

答えて

1

あなたはprintParentに親のprintChildの名前を変更(およびprintのを修正)提案として、それはすでに、パイソン3で動作します:

1 
2 
3 
4 

でも、python2でも動作させることができます。これは、子供に関連すると思われる項目kwargsを削除して、親に渡す前に実行します。

コード(のpython3のために働い):

class Parent(object): 
    def __init__(self, motherArg1, motherArg2=100): 
     self.motherArg1 = motherArg1 
     self.motherArg2 = motherArg2 
    def printParent(self): 
     print(self.motherArg1) 
     print(self.motherArg2) 

class Child(Parent): 
    def __init__(self, childArg1, *args, childArg2=100, **kwargs): 
     super(Child, self).__init__(*args, **kwargs) 
     self.childArg1 = childArg1 
     self.childArg2 = childArg2 
    def printChild(self): 
     print(self.childArg1) 
     print(self.childArg2) 

child = Child(1, 3, childArg2=2, motherArg2=4) 
child.printChild() 
child.printParent() 

コードのPython 2ではpython2

class Parent(object): 
    def __init__(self, motherArg1, motherArg2=100): 
     self.motherArg1 = motherArg1 
     self.motherArg2 = motherArg2 
    def printParent(self): 
     print(self.motherArg1) 
     print(self.motherArg2) 

class Child(Parent): 
    def __init__(self, childArg1, *args, **kwargs): 
     # this shows the concept, it can be formulated more elegantly 
     # with @Martijn Pieters answer's 'pop': 
     if 'childArg2' in kwargs: 
      childArg2 = kwargs['childArg2'] 
      del kwargs['childArg2'] 
     else: 
      childArg2 = 2 
     super(Child, self).__init__(*args, **kwargs) 
     self.childArg1 = childArg1 
     self.childArg2 = childArg2 
    def printChild(self): 
     print(self.childArg1) 
     print(self.childArg2) 

child = Child(1, 3, childArg2=2, motherArg2=4) 
child.printChild() 
child.printParent() 
+1

OPは明示的な 'object'と' print'ステートメントを使用しているので、コードは*動作していないことを報告しているだけでなく、2.xを使用していることは明らかです。 3.xで動作することを伝えることはあまり有効ではありません。 – jonrsharpe

+0

あなたは正しいです。私は今、Python 2のバージョンを追加しました – DomTomCat

+0

あなたはPython 3で動作するとは言いませんでした。ありがとうございました! – hayj

2

について、あなたは*args引数後の明示的なキーワード引数を置く必要があります。

def __init__(self, childArg1, childArg2=100, *args, **kwargs): 

ただし、彼らはchildArg2引数によって捕獲されているとして、追加の位置パラメータとにかくを使用します。

>>> child = Child(1, 3, childArg2=2, motherArg2=4) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: __init__() got multiple values for keyword argument 'childArg2' 

あなたの唯一のオプションは**kwargs辞書からキーワード引数を取ることです。

def __init__(self, childArg1, *args, **kwargs): 
    childArg2 = kwargs.pop('childArg2', 2) 

これはchildArg2作品を作るだけのように明示的なキーワード引数、および*argsは、すべての追加の位置指定引数を取得します。

>>> class Parent(object): 
...  def __init__(self, motherArg1, motherArg2=100): 
...   self.motherArg1 = motherArg1 
...   self.motherArg2 = motherArg2 
...  def printParent(self): 
...   print self.motherArg1 
...   print self.motherArg2 
... 
>>> class Child(Parent): 
...  def __init__(self, childArg1, *args, **kwargs): 
...   childArg2 = kwargs.pop('childArg2', 2) 
...   super(Child, self).__init__(*args, **kwargs) 
...   self.childArg1 = childArg1 
...   self.childArg2 = childArg2 
...  def printChild(self): 
...   print self.childArg1 
...   print self.childArg2 
... 
>>> child = Child(1, 3, childArg2=2, motherArg2=4) 
>>> child.printChild() 
1 
2 
>>> child.printParent() 
3 
4 
関連する問題