打电话给父母的父母的方法,有什么后果吗?

时间:2017-02-20 11:28:12

标签: python oop inheritance

基本上,我遇到的问题是here,并且有一些答案,如下所示,其中Son执行某些操作,例如Father(本例中为init)和其他一些GrandFatherdo_thing)等内容。

class GrandFather(object):
    def __init__(self):
        pass

    def do_thing(self):
        # stuff

class Father(GrandFather):
    def __init__(self):
        super(Father, self).__init__()

    def do_thing(self):
        # stuff different than Grandfather stuff

class Son(Father):
    def __init__(self):
        super(Son, self).__init__()

    def do_thing(self):
        super(Father, self).do_thing()  # <-- this line bypasses Father's implementation

我想知道的是,如果对super这样的调用(上面的最后一行)有任何影响,即传递除你自己以外的类类型。 我的意思是你的代码在一些奇怪的地方打破,你不指望它。

1 个答案:

答案 0 :(得分:0)

您所询问的内容通常会有效,但在多重继承存在的情况下,它可能无法完全满足您的要求。例如,如果Son也继承自Mother类(由于乱伦也是Grandfather的子类),您将无法从最后一行获得预期的电话:

class GrandFather(object):
    def do_thing(self):
        print("Grandfather")

class Father(GrandFather):
    def do_thing(self):
        print("Father")

class Mother(GrandFather):
    def do_thing(self):
        print("Mother")

class Son(Father, Mother):
    def do_thing(self):
        super(Father, self).do_thing() # will print "Mother", not "Grandfather"

如果在Son子类中添加了多重继承(例如class GrandSon(Son, Mother): pass,而您之前定义的Son只继承自Father),则此问题甚至会突然出现问题

这可能是也可能不是你想要的。如果您希望GrandFather始终do_thing实施GrandFather.do_thing(self),则应明确呼叫super,而不是尝试使用GrandFather.do_thing

但是,让课程绕过父母方法通常不是一个好主意。重新组织代码可能会更好地为您服务,因此不需要它。也许您可以将Son中希望Father能够用于单独方法的部分分解出来。您无需在Father.do_thing中覆盖该方法,也不能从$SelList = "ProcessName,Handles" 调用该方法。