在Python中调用构造函数的顺序

时间:2013-04-03 01:41:53

标签: python

#!/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中不会发生这种情况?

3 个答案:

答案 0 :(得分:9)

来自Zen of Python

  

明确比隐含更好。

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()