继承类设置常量参数的最佳实践

4

我有一个名为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不起作用,并打印出“red”。我有一堆变量,如table_color,它们仅在初始化时使用一次。我知道我可以将table_color定义为类变量,或者在GUI_child中重新定义draw_table(),但我觉得这些可能不是最佳选项。
(编辑:由于这些变量仅使用一次,我不会更改或访问它们,因此将它们设置为类变量似乎是冗余的。如果我重新定义draw_table(),那么它只是复制粘贴,从我的角度来看这也不是一个好的做法。)
对于这种用法,最佳实践是什么?

1
我很想开个玩笑,说“继承”和“最佳实践”是互相排斥的。 - byxor
1
你为什么感觉这可能不是最佳选择 - Moses Koledoye
@MosesKoledoye 由于这些变量仅被使用一次,而且我不会更改或访问它们,将它们设置为类变量似乎是多余的。如果我重新定义draw_table(),那么它只是复制粘贴,从我的角度来看,这也不是一个好的实践。 - Ken C. Chang
1个回答

3
将定义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: {}".format(self.table_color))

class GUI_child(GUI):
    table_color = "blue"

    def __init__(self):
        super(GUI_child, self).__init__()

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

注意,根据PEP 8 - Python 代码风格指南,常量应全部大写。这意味着table_color应更改为TABLE_COLOR


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接