Python子类继承父类__init__方法的调用机制与实现

陆景行
陆景行
发布时间:2026-10-12 | 2人浏览过
原创

在Python面向对象编程中,子类继承父类的__init__方法是一个核心概念。理解其自动调用与显式调用的区别,对于正确初始化对象属性至关重要。本文将通过代码实例解析这一机制。

__init__方法的基本行为

在Python中,__init__方法在对象实例化时立即执行,主要用于执行对象的初始化操作。该方法名首尾均包含双下划线。理解其调用规则有助于避免子类初始化时的常见陷阱。

子类未重写__init__的情况

当子类没有定义自己的__init__方法时,Python会自动调用父类的__init__方法。以下代码展示了这一行为:

class A(object):
 def __init__(self, name):
  self.name=name
  print "name:", self.name
 def getName(self):
  return 'A ' + self.name
class B(A):
 def getName(self):
  return 'B '+self.name
 
if __name__=='__main__':
 b=B('hello')
 print b.getName()

运行上述代码,输出结果如下:

$python lei2.py 
name: hello
B hello

可以看到,尽管子类B没有定义__init__,但父类A中的print "name:", self.name依然被执行,说明父类的初始化逻辑被自动调用。

子类重写__init__的情况

如果子类定义了自身的__init__方法,Python将不再自动调用父类的__init__。此时,若需要执行父类的初始化逻辑,必须显式调用。

以下示例中,子类B重写了__init__,但未调用父类方法:

class A(object):
 def __init__(self, name):
  self.name=name
  print "name:", self.name
 def getName(self):
  return 'A ' + self.name

class B(A):
 def __init__(self, name):
  print "hi"
  self.name = name
 def getName(self):
  return 'B '+self.name

if __name__=='__main__':
 b=B('hello')
 print b.getName()

运行结果如下:

$python lei2.py 
hi
B hello

注意,输出中缺少了父类A中的name: hello打印信息,这表明父类的__init__未被执行。虽然子类中手动设置了self.name = name,但这并非最佳实践,且容易遗漏父类中其他重要的初始化步骤。

显式调用父类__init__的最佳实践

为了在子类中既执行自己的初始化逻辑,又保留父类的初始化行为,应使用super()函数显式调用父类的__init__方法。

修正后的代码如下:

class A(object):
 def __init__(self, name):
  self.name=name
  print "name:", self.name
 def getName(self):
  return 'A ' + self.name

class B(A):
 def __init__(self, name):
  super(B, self).__init__(name)
  print "hi"
  self.name = name
 def getName(self):
  return 'B '+self.name

if __name__=='__main__':
 b=B('hello')
 print b.getName()

运行结果如下:

$python lei2.py
name: hello
hi
B hello

从输出可以看出,父类A的__init__方法(打印name: hello)和子类B的__init__方法(打印hi)均被执行。这是推荐的做法,确保了对象初始化的完整性和一致性。

总结

在Python中,子类是否自动调用父类的__init__取决于子类是否重写了该方法。若子类重写了__init__,则必须通过super()显式调用父类方法,以确保父类的初始化逻辑得以执行。遵循这一原则,可以避免因遗漏父类初始化而导致的潜在错误。

以上就是Python中子类继承父类__init__方法的详细内容,更多关于Python面向对象编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表