2013-01-31 16 views
34

親クラスのメソッドを上書きすることが多く、指定されたパラメーターを明示的に指定するか、ブランケット*args, **kwargsを使用するか決して決してできません。あるバージョンは他のバージョンより優れていますか?ベストプラクティスはありますか?私は何の欠点があるのでしょうか? 継承のベストプラクティス:* args、** kwargs、または明示的にパラメーターを指定する

  • 関数パラメータを把握しやすい
  • (パイソンの禅)

    • より明示的な明示的な変異体の

      class Parent(object): 
      
          def save(self, commit=True): 
           # ... 
      
      class Explicit(Parent): 
      
          def save(self, commit=True): 
           super(Explicit, self).save(commit=commit) 
           # more logic 
      
      class Blanket(Parent): 
      
          def save(self, *args, **kwargs): 
           super(Blanket, self).save(*args, **kwargs) 
           # more logic 
      

      知覚利点は容易の

    知覚利点アクセスブランケットバリエーションNT

    • よりDRY
    • 親クラスは簡単に交換可能です
    • 親メソッドにおけるデフォルト値の
    • 変更は、他のコードに触れることなく伝播され
  • +2

    多くのことは、サブクラス化しているものに正確に依存します...基本クラスのメソッドに追加のkwargsを追加する可能性が高い場合は、 '' kwargs''に固執するのが大変です。これがそうでない場合、明示的にkwargsを指定することは、可読性の観点からはるかに優れています。 –

    +0

    あなたは確かに情報を捨てています。明示的なものは暗黙的なものよりも優れています。 – kojiro

    +2

    1)明示的にパラメータを指定し、派生したクラスで*シグネチャの変更を禁止する(そうでなければ 'super'と多重継承でうまくいく)、または2)' ** kwargs'を使ってメソッドのシグネチャを変更できるようにする。どちらを使うべきかは、おそらく状況に依存します。 – Bakuriu

    答えて

    関連する問題