【发布时间】:2021-07-30 19:19:52
【问题描述】:
考虑下面的代码:
class Parent():
def __init__(self, ...):
# set up logging
# ....
class Child(Parent):
def __init__(self, ...):
super(Child, self).__init__(...)
print(1/0)
c = Child()
由于1/0,上述操作将失败。当__init__ 失败时,是否有可能在Parent 中执行一些逻辑(例如:我想记录一些东西)?也就是说,我想在 Child 类的 __init__ 中捕获异常,然后在整个实例被垃圾收集之前执行诸如日志记录之类的操作。
【问题讨论】:
-
super()调用返回后,Child类的构造函数完全独立于父类的构造函数。您将无法在Child类的构造函数中捕获错误,因为父构造函数已被调用(使用super(...))并返回,因此它不再位于调用堆栈中。子构造函数中的错误将被抛出给调用者,这是初始化Child类(在本例中为顶级)实例的代码。 -
给孩子打扫卫生不是父母的工作。
-
Child的__init__()可以捕获异常并调用其Parent的方法来处理它。 -
您可能还在寻找Factory Pattern,您的工厂方法将能够在初始化实例时处理抛出的错误。