2012-05-05 3 views
3

私はPythonで、次のオープンソースコードを見つけた:Class属性または引数のデフォルト値

class Wait: 

    timeout = 9 

    def __init__(self, timeout=None): 

    if timeout is not None: 
     self.timeout = timeout 
    ... 

私はデフォルトの引数の値を使用して、VS上記のコードの利点があるかどうかを理解しようとしている:

class Wait: 

    def __init__(self, timeout=9): 
    ... 
+0

同じことをしません。クラス属性はインスタンス間で共有されます。 – Avaris

+0

@Avaris 'self.timeout = 9'を実行すると、2番目の構文例では、クラス変数/属性を設定しています。 – Ben

+1

@Ben 'self.x = ...'をやっているところで、インスタンス属性を設定しています。 –

答えて

12

これは、デフォルト値をこのように変更することが可能です:

Wait.timeout = 20 

はそれを意味します、私F解除、デフォルトは20

例えば次のようになります。

>>> class Wait: 
...  timeout = 9 
...  def __init__(self, timeout=None): 
...   if timeout is not None: 
...    self.timeout = timeout 
... 
>>> a = Wait() 
>>> b = Wait(9) 
>>> a.timeout 
9 
>>> b.timeout 
9 
>>> Wait.timeout = 20 
>>> a.timeout 
20 
>>> b.timeout 
9 

これは、インスタンス属性が見つからない場合、クラス属性のPythonが見えることを利用しています。

+0

良い説明。 –

0

意味的にクラス属性は、クラスのパブリックインターフェイスのデフォルトのタイムアウト部分を作るようなものです。ドキュメントに応じて、エンドユーザは を読んだり、おそらくデフォルトを変更することをお勧めします。

デフォルトのパラメータ値を使用する代わりに、特定のデフォルト値が実装の詳細であることが強く示唆されています。クラスのエンドユーザーは慎重ではありません。

+0

いいえ。デフォルトのパラメータが実装の詳細である場合、 '_timeout = 9'のようにその名前の前にアンダースコアを付ける必要があります。 –

関連する問題