让我们说:
class Parent():
def __init__(self):
foo()
def foo(self):
//do stuff
class Child(Parent):
def __init__(self):
Parent.__init__()
class Grandchild(Child):
def __init__(self):
Child.__init__()
def foo(self):
//different stuff
Child
级别上有许多使用相同的foo()
的类。 Grandchild
级别的foo
版本略有不同,但是启动Grandchild
时,foo()
中的Parent.__init__()
调用使用Parent.foo()
而不是Grandchild.foo()
。
遇到这种情况是否有正确的做法?
答案 0 :(得分:1)
您没有正确调用基类的__init__()
方法-您需要将self
参数传递给它们:
class Parent:
def __init__(self):
self.foo()
def foo(self):
print('Parent stuff')
class Child(Parent):
def __init__(self):
Parent.__init__(self)
class Grandchild(Child):
def __init__(self):
Child.__init__(self)
def foo(self):
print('Grandchild stuff')
if __name__ == '__main__':
gc = Grandchild() # -> Grandchild stuff
如果您使用super()
而不是明确声明基类,则不必这样做:
class Parent:
def __init__(self):
self.foo()
def foo(self):
print('Parent stuff')
class Child(Parent):
def __init__(self):
# Parent.__init__(self)
super().__init__()
class Grandchild(Child):
def __init__(self):
# Child.__init__(self)
super().__init__()
def foo(self):
print('Grandchild stuff')
if __name__ == '__main__':
gc = Grandchild() # -> Grandchild stuff
另一个优点是,如果您更改了子类的基类,则不必更改其__init__()
方法中的代码。