#!/usr/bin/python
class Parent(object): # define parent class
parentAttr = 100
def __init__(self):
print "Calling parent constructor"
def parentMethod(self):
print 'Calling parent method'
def setAttr(self, attr):
Parent.parentAttr = attr
def getAttr(self):
print "Parent attribute :", Parent.parentAttr
class Child(Parent): # define child class
def __init__(self):
print "Calling child constructor"
def childMethod(self):
print 'Calling child method'
c = Child() # instance of child
我已调用在这里创建了一个Child类的实例。它似乎没有调用父类的构造函数。输出如下所示。
Calling child constructor
在C ++中,例如当你调用派生类的构造函数时,首先调用基类构造函数。为什么在Python中不会发生这种情况?
答案 0 :(得分:9)
明确比隐含更好。
Python是否应该在子构造函数之前或之后调用父构造函数?有什么论据?不知道,它让你决定。
class Child(Parent): # define child class
def __init__(self):
super(Child, self).__init__() # call the appropriate superclass constructor
print "Calling child constructor"
另请参阅this StackOverflow post了解使用super()
的好处。
答案 1 :(得分:5)
您需要在子类的__init__
方法中显式调用父构造函数。尝试:
class Child(Parent): # define child class
def __init__(self):
Parent.__init__(self)
print "Calling child constructor"
答案 2 :(得分:2)
如果你有Python 3.x,你可以运行它(它几乎就是你在你自己的代码中所做的):
#! /usr/bin/env python3
def main():
c = Child()
c.method_a()
c.method_b()
c.get_attr()
c.set_attr(200)
Child().get_attr()
class Parent:
static_attr = 100
def __init__(self):
print('Calling parent constructor')
def method_a(self):
print('Calling parent method')
def set_attr(self, value):
type(self).static_attr = value
def get_attr(self):
print('Parent attribute:', self.static_attr)
class Child(Parent):
def __init__(self):
print('Calling child constructor')
super().__init__()
def method_b(self):
print('Calling child method')
if __name__ == '__main__':
main()