2016-09-15 54 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'傳遞給'Editor'。 –

回答

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

如果您期望它們是非常標準的,那麼您可以在類對象本身上指定默認屬性,然後可以在需要時通過在實例上重新分配這些屬性來遮蔽它們。您還可以使用@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) 

,並得到一個正確的框初始化編輯器實例。

相關問題