2016-09-15 9 views
4

私は過負荷を働かせることができないので、私は多くのデフォルトを持つクラスを持っています。複数のデフォルト引数を持つかkwargsを使うよりも良い方法がありますか?クラスに複数のデフォルト引数を持たせるためには、もっとpythonicな方法がありますか?

私は自分のクラスに辞書を渡すことを考えましたが、必要な引数が渡されるかどうかをどのように制御しますか?

もし私がこれをやっているはずのもっとpythonicな方法があれば?

class Editor: 
    def __init__(self, 
       ffmpeg: str, 
       font_file=None, 
       font_size=148, 
       font_color="white", 
       title_length=5, 
       title_x="(w-text_w)/2", 
       title_y="(h-text_h)/2", 
       box=1, 
       box_color="black", 
       box_opacity=0.5, 
       box_border_width=25): 
     self.ffmpeg = ffmpeg 
     self.commands = {'help': [self.ffmpeg, '-h']} 
     self.command_sequence = [] 
     self.titles= {"font": {"file": font_file, 
           "size": font_size, 
           "color": font_color}, 
         "length": title_length, 
         "box": {"status": box, 
           "color": box_color, 
           "opacity": box_opacity, 
           "borderw": box_border_width}, 
         "coordinates": {"x": title_x, 
             "y": title_y}} 
+0

サブオブジェクトに分解できますか?たとえば、最後の4つのパラメータだけを必要とする 'box'オブジェクトです。それで 'エディタ'に 'box 'を渡すだけです。 –

答えて

1

一つの方法は、method chainingを使用することです。

あなたはデフォルトにすべての(またはほとんどの)パラメータを設定するいくつかのクラスで始めることができます。

class Kls(object): 
    def __init__(self): 
     self._var0 = 0 
     self._var1 = 1 

はその後、それぞれ必要なものを設定するためのメソッドを追加します。

def set_var_0(self, val): 
     self._var0 = val 
     return self 

    def set_var_1(self, val): 
     self._var1 = val 
     return self 

、あなたが作成したときあなたは必要なものだけを設定することができます:

c = Kls() 

c = Kls().set_var_1(2) 

c = Kls().set_var_1(22).set_var_0(333) 

もちろん、あなたはwrそのたびに1つのパラメータを設定するメソッドでは、パラメータの小さな「ファミリ」を設定するメソッドを記述することができます。これらは、必要に応じて、すでに通常のデフォルト値を持っている場合があります。

1

クラスオブジェクト自体にかなりの標準があると思われる場合は、デフォルトの属性を指定できます。必要に応じてインスタンスの属性を再割り当てすることで、その属性を隠すことができます。 。あなたがに渡される引数の異なるグループをしたい場合にも、@classmethodを使用して

class Editor(object): 
    font_file: None 
    font_size: 148 
    def __init__(self, ffmpeg=str): 
     self.ffmpeg = ffmpeg 
    @classmethod 
    def with_box(cls, ffmpeg=str, box=1): 
     new_editor = cls(ffmpeg) 
     new_editor.box = box 
     return new_editor 

を複数のコンストラクタを作成することができます。そして、あなたは呼び出します。

Editor.with_box(ffmpeg=int, box=2) 

を、適切に箱に初期化エディタを取り戻しますインスタンス。

関連する問題