子类继承父类后,可以选择是否调用父类的构造函数(即__init__
函数)。
1. 不调用父类构造函数
如果子类不想调用父类的构造函数,就需要写出自己的构造函数:
class Parent(object):
def __init__(self, number):
self._number = str(number)
print('Parent')
self.call_number()
def call_number(self):
print('Parent\'s number is ' + self._number)
class Child(Parent):
def __init__(self, number):
self._number = str(number)
print("Child")
self.call_number()
def call_number(self):
print('Child\'s number is ' + self._number)
cx = Child(123)
# 输出为 Child
# Child's number is 123
2. 调用父类构造函数
如果想调用父类中的构造函数,有两种方法可用。一种是子类中不写构造函数,一种是在子类的构造函数中继承父类的构造函数。
2.1 子类中不写构造函数
class Parent(object):
def __init__(self, number):
self._number = str(number)
print('Parent')
self.call_number()
def call_number(self):
print('Parent\'s number is ' + self._number)
class Child(Parent):
def call_number(self):
print('Child\'s number is ' + self._number)
cx = Child(123)
# 输出为 Parent
# Child's number is 123
可见,当子类中没有构造函数时,将调用父类的构造函数。
在这里还可以发现,调用完父类的构造函数之后,父类的self.call_number()
调用的是子类中的方法。所以我们还可以知道,当子类中的方法名称与父类中的重合时,将优先调用子类中的方法。
2.2 子类的构造函数继承父类的构造函数
继承的写法有两种:
super(子类名, self).__init__(参数1,...)
在python3中可直接简写为super().__init__(参数1,...)
(父类名).__init__(self, 参数1,...)
class Parent(object):
def __init__(self, number):
self._number = str(number)
print('Parent')
self.call_number()
def call_number(self):
print('Parent\'s number is ' + self._number)
class Child(Parent):
def __init__(self, number):
super().__init__(number)
# Parent.__init__(self, number)
self._number = str(number)
self.call_number()
def call_number(self):
print('Child\'s number is ' + self._number)
cx = Child(123)
#输出结果为:Parent
# Child's number is 123
# Child
# Child's number is 123
由于继承的父类的和子类自有的构造函数中均有self.call_number()
及print()
,因此打印了连两次。