2017-11-09 7 views
0

さらなる縮尺を容易にするため、クラスBookargsと 'kwargs'と定義します。'* args'と '* kwargs'を適用してクラスを定義する方法

class Book: 
    def __init__(self, *args, **kwargs): 
     if args: 
      self.name,\ 
      self.author,\ 
      = args 
     elif kwargs: 
      self.__dict__.update(kwargs) 

これは、位置と、それぞれうまく機能し、引数

In [62]: book1 = Book('Python', 'Guido') 
In [63]: book1.author 
Out[63]: 'Guido' 

In [65]: book2 = Book(name='Python', author='Guido') 
In [66]: book2.name 
Out[66]: 'Python' 

テストの位置とキーワード引数、エラーレポートの混合物とをキーワード。

In [67]: book3 = Book('Python', author='Guido') 
ValueError: not enough values to unpack (expected 2, got 1) 

バグが*argsや「kwargsから」を取ることなく、複数の条件または標準精細classで固定することができます。

エレガントな方法で修正するにはどうすればよいですか?

+1

ですが、念のためにあなたは絶対にここに一つの方法ですが、それを必要としますか?あなたがそれらを使用しようとしている方法が意図した/設計された方法と一致しないためです。 – SethMMorton

+1

だから彼らの最初の意図は何ですか?導入された材料はどれですか? –

+2

あなたは解凍しようとしています: 'self.name、self.author =( 'Python'、)'。入力があなたが期待しているものであることを確認してください。 'len(args)'を最初にチェックしてください。 – CristiFati

答えて

2

あなたがそれらを使用したいの方法は、それらが使用されることを意図していた彼らの方法ではありませんので、私は、ここに*args**kwargsに対して助言します。名前付き引数を使うだけで、必要なものをすべて実行することができます。

class Book: 
    def __init__(self, name, author): 
     self.name = name 
     self.author = author 

期待どおりに動作します。

In [2]: book1 = Book('Python', 'Guido') 

In [3]: book2 = Book(name='Python', author='Guido') 

In [4]: book3 = Book('Python', author='Guido') 

In [7]: book1.name == book2.name 
Out[7]: True 

In [8]: book1.name == book3.name 
Out[8]: True 

In [9]: book2.name == book3.name 
Out[9]: True 
+1

タイ。 –

3

あなたの目標は、オプションのnameauthor引数を受け入れるのであれば、デフォルトの引数を使用する必要があります。

class Book(object): 

    def __init__(self, name=None, author=None): 
     self.name = name 
     self.author = author 

だけでなく、このクラス定義を簡単にするん、それはまた__init__署名で、より良い意思を伝えます

>>> c = Book("best book", "me") 
>>> c.name 
'best book' 
>>> c.author 
'me' 
>>> c = Book(author="me", name="best book") 
>>> c.name 
'best book' 
>>> c.author 
'me' 
>>> c = Book("best_book", author="me") 
>>> c.name 
'best book' 
>>> c.author 
'me' 
+0

オプションの引数を設定すると便利です。忍耐のために –

0

私はargsとkwargsに対してアドバイスします。

class Book: 
    def __init__(self, *args, **kwargs): 
     attributes = ['name', 'author'] 
     for item in zip(attributes, args): 
      kwargs[item[0]] = item[1] 
     self.name = kwargs.get('name') 
     self.author = kwargs.get('author') 

    def show(self): 
     print('Name={name}, author={author}'.format(name=self.name, author=self.author)) 

book1 = Book('Python', 'Guido') 
book1.show() 
book2 = Book(name='Python', author='Guido') 
book2.show() 
book3 = Book('Python', author='Guido') 

実行出力:それはあなたが `* args`と` ** kwargs`を使用するハード要件

Name=Python, author=Guido 
Name=Python, author=Guido 
Name=Python, author=Guido 
関連する問題