python 继承类的初始化用法
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成员):
注释掉demo.x
这行就没问题:
说明子类只是重写了父类的__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()
这说明子类B中初始化方法中添加一行super().__init__(x, y)
代码会调用父类A中的初始化方法,而不会直接的覆盖父类初始化方法,同时注意传参。
进一步地,子类中任意位置添加super().func(*args)
都会调用父类中的func()函数。
需要声明的一点是,python2中,必须使用super(B, self).func(*args)
才能调用父类A中的func()函数;此外父类A也要继承自object:class A(object):
,这在python3中是可以省略的。
修改后: