python 子类调用 父类的构造函数

class A(object):
  def __init__(self):
    self.nameaa = 'aa'
  def funca(self):
    print('function a %s' % self.nameaa)
     
class B(A):
  def __init__(self):
    self.namebb = 'bb'
   def funcb(self):
    print('function b %s' % self.namebb)
     
b = B()
print(b.namebb)
b.funcb()
print(b.nameaa)
b.funca()

结果:

================ RESTART: D:/ADB/kuaidou0102/kuaidou1210/li3.py ================
bb
function b bb
Traceback (most recent call last):
File "D:/ADB/kuaidou0102/kuaidou1210/li3.py", line 16, in <module>
print(b.nameaa)
AttributeError: 'B' object has no attribute 'nameaa'
>>>

出错的原因:

在子类中重写了构造函数,但新的构造函数没有初始化父类,当没有初始化父类的构造函数时,就会报错

解决方法:

在子类中初始化父类的构造函数

修改后的程序如下:

class A(object):
    def __init__(self):
        self.nameaa = 'aa'
    def funca(self):
        print('function a %s' % self.nameaa)
     
class B(A):
    def __init__(self):
        self.namebb = 'bb'
        A.__init__(self) #在子类中初始化父类的构造函数,因为在子类中重写了构造函数。如果子类中没有重写构造函数则不需要再一次初始化父类的构造函数
    def funcb(self):
        print('function b %s' % self.namebb)
     
b = B()
print(b.namebb)
b.funcb()
print(b.nameaa)
b.funca()

上面的程序结果:

================ RESTART: D:/ADB/kuaidou0102/kuaidou1210/li3.py ================
bb
function b bb
aa
function a aa
>>>

 也可以将刚才添加的“A.__init__(self)

改为:super(B,self).__init__()也会实现相同的结果

 

posted @ 2021-01-03 06:48  myrj  阅读(653)  评论(0编辑  收藏  举报