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的属性,恰好具有与要使用的父类相同的属性名称。
答案 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
方法,则当前的代码将不会使用它,而这通常不是您想要的。