super()。method()与Parent.method()

时间:2019-05-04 23:32:54

标签: python-3.x class object abstract-class

class Parent():
    def __init__(self, x):
        self.x = x
        print('init parent')
    def hithere(self):
        print('hey there')
        print(self.x)

class Child(Parent):
    def __init__(self, x):
        self.x = x
        super().hithere()

child = Child(3)

在这里,我有一个父类和一个子类,它们由父级继承。 为什么我需要super()如果我总是可以通过用父类的名称替换它来做同样的事情,则该父类在此处:

class Parent():
    def __init__(self, x,y):
        self.x = x
        self.y = y
        print('init parent')
    def hithere(self):
        print('hey there')
        print(self.x)

class Child(Parent):
    def __init__(self, x):
        self.x = x
        Parent.hithere(self)

child = Child(3)

执行相同的操作。

我的第二个问题是,抽象类不能具有属性吗?如果Parent是一个抽象类,那么每当其中一种方法像hithere(self)一样调用self时,我都需要使用super()。method(self)传递回去。因此,这些属性实际上是Child的属性,恰好具有与要使用的父类相同的属性名称。

2 个答案:

答案 0 :(得分:0)

这是一回事,但您应该super(),因为:

将来,如果您想更改父类的名称,则不必为每个实例都更改名称。

例如

Parent.hithere(self)
Parent.hithere1(self)
Parent.hithere2(self)

现在,如果您更改父类的名称,则必须为每个实例更改名称Parent。如果您愿意的话,情况并非如此:

super().hithere1()
super().hithere2()
super().hithere3()

我认为您的第二个问题模棱两可,但是您可以阅读有关抽象类here的更多信息。

答案 1 :(得分:0)

除非您正在编写覆盖self.foo()的{​​{1}}方法,否则几乎总是要使用Child.foo

如果以后再编写一个Parent.foo方法,则当前的代码将不会使用它,而这通常不是您想要的。