python 继承类的初始化用法 这说明子类B中初始化方法中添加一行super().__init__(x, y)代码会调用父类A中的初始化方法,而不会直接的覆盖父类初始化方法,同时注意传参。 进一步地,子类中任意位置添加super().func(*args)都会调用父类中的func()函数。

Python 中,子类B继承父类A时候会用class B(A):的代码形式声明B。

class A:
	def __init__(self, x=1, y=2):
		self.x = x
		self.y = y
		print("In class A's init...")

	def Aprint(self):
		print("AAAAAAAAAAAAA")

在子类B的初始化方法默认会覆盖掉父类A的初始化方法,举例:

class B(A):
	def __init__(self, z):
		self.z = z
		print("In class B's init...")

	def Bprint(self):
		print("BBBBBBBBBBBBB")

demo = B(3)
print(demo.z)
print(demo.x)
demo.Aprint()
demo.Bprint()

报错显示B中找不到成员x(肯定也找不到y成员):
python 继承类的初始化用法

这说明子类B中初始化方法中添加一行super().__init__(x, y)代码会调用父类A中的初始化方法,而不会直接的覆盖父类初始化方法,同时注意传参。
进一步地,子类中任意位置添加super().func(*args)都会调用父类中的func()函数。
注释掉demo.x这行就没问题:
python 继承类的初始化用法

这说明子类B中初始化方法中添加一行super().__init__(x, y)代码会调用父类A中的初始化方法,而不会直接的覆盖父类初始化方法,同时注意传参。
进一步地,子类中任意位置添加super().func(*args)都会调用父类中的func()函数。
说明子类只是重写了父类的__init__方法,其他方法(Aprint)得以继承。
现在在B的__init__方法中加入一行代码:super().__init__(x, y)或者super(B, self).__init__(x, y),并且接受新的变量x、y:

class B(A):
	def __init__(self, z, x, y):
		# super(B, self).__init__(x, y)
		super().__init__(x, y)
		self.z = z
		print("In class B's init...")

	def Bprint(self):
		print("BBBBBBBBBBBBB")

现在调用全体的变量和方法试试看:

demo = B(3,4,10)
print(demo.z)
print(demo.x)
print(demo.y)

demo.Aprint()
demo.Bprint()

需要声明的一点是,python2中,必须使用super(B, self).func(*args)才能调用父类A中的func()函数;此外父类A也要继承自object:class A(object):,这在python3中是可以省略的。
python 继承类的初始化用法

这说明子类B中初始化方法中添加一行super().__init__(x, y)代码会调用父类A中的初始化方法,而不会直接的覆盖父类初始化方法,同时注意传参。
进一步地,子类中任意位置添加super().func(*args)都会调用父类中的func()函数。
修改后:
python 继承类的初始化用法

这说明子类B中初始化方法中添加一行super().__init__(x, y)代码会调用父类A中的初始化方法,而不会直接的覆盖父类初始化方法,同时注意传参。
进一步地,子类中任意位置添加super().func(*args)都会调用父类中的func()函数。