2017-06-30 115 views
1

我有一個類GUI定義如下:最佳實踐來設置繼承類常量參數

table_color = "red" 

class GUI: 
    def __init__(self): 
     self.draw_table() 

    def draw_table(self): 
     print "table color: ", table_color 

,我想基於GUI定義一個子類GUI_child

table_color = "blue" 

class GUI_child(GUI): 
    def __init__(self): 
     GUI.__init__(self) 

然而,以上GUI_child不起作用並打印「紅色」。我有一堆像table_color這樣的變量,它們在初始化時只使用一次。我知道我可以將table_color定義爲類變量,或者在GUI_child中再次定義draw_table(),但感覺這些可能不是最佳選擇。 (編輯:由於這些變量只用了一次,我不會改變或訪問它們,將它們設置爲類變量似乎是多餘的。如果我重新定義draw_table()它將只是複製粘貼,在我看來也不是很好的做法。)

這種用法的最佳做法是什麼?

+1

我很想開個玩笑說「繼承」和「最佳實踐」是相互排斥的。 – byxor

+1

你爲什麼覺得這些可能不是最好的選擇*? –

+0

@MosesKoledoye由於這些變量只能使用一次,而且我不會更改或訪問它們,所以將它們設置爲類變量似乎是多餘的。如果我重新定義'draw_table()',它只是複製粘貼,在我看來這也不是一個好的做法。 –

回答

0

將定義table_color = "red"移到class GUI定義的開頭,並在類的方法中將其與self.table_color一起引用。將它移動到類中使其成爲將由派生類繼承的類屬性。

但是,您可以通過在子類定義中重新定義其值(以相同方式)來重寫它的值,以防止繼承父類中的值。

這裏就是我的意思是:

class GUI: 
    table_color = "red" 

    def __init__(self): 
     self.draw_table() 

    def draw_table(self): 
     print "table color: ", self.table_color 

class GUI_child(GUI): 
    table_color = "blue" 

    def __init__(self): 
     GUI.__init__(self) 

gui = GUI()    # -> table color: red 
gui_child = GUI_child() # -> table color: blue 

注意,根據該PEP 8 - Style Guide for Python Code,常量應全部大寫。這意味着table_color應更改爲TABLE_COLOR

+0

看起來不錯!謝謝。 –