5
#!/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

我在这里调用了创建子类​​的实例。它似乎没有调用父类的构造函数。输出如下所示。

Calling child constructor

例如,在 C++ 中,当您调用派生类的构造函数时,首先调用基类构造函数。为什么在 Python 中不会发生这种情况?

4

3 回答 3

12

来自Python 之禅

显式优于隐式。

Python 应该在子构造函数之前还是之后调用父构造函数?有什么论据?不知道,留给你决定。

class Child(Parent): # define child class
    def __init__(self):
        super(Child, self).__init__()  # call the appropriate superclass constructor
        print "Calling child constructor"

另请参阅此 StackOverflow 帖子,了解使用super().

于 2013-04-03T01:44:31.380 回答
5

您需要__init__在子类的方法中显式调用父构造函数。尝试:

class Child(Parent): # define child class
   def __init__(self):
      Parent.__init__(self)
      print "Calling child constructor"
于 2013-04-03T01:44:25.537 回答
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()
于 2013-04-03T01:59:12.280 回答