首先,我知道 Python 中类的 __init__()
函数不能返回值,所以遗憾的是这个选项不可用。
由于我的代码结构,在类的 __init__
函数中进行数据断言(并提示用户提供信息)是有意义的。但是,这意味着对象的创建可能会失败,我希望能够从中优雅地恢复。
我想知道继续此操作的最佳方法是什么。我考虑过将全局 bool 值设置为“有效构造”标志,但我不想这样做。
任何其他想法(除了重组之外,断言可以在初始化之外发生,并且值作为参数传递)?我基本上是在寻找一种在初始化期间成功返回 0 并在失败时返回 -1 的方法。 (像大多数 C 系统调用一样)
最佳答案
您可以在 assertio 失败时引发异常,或者 - 如果您真的不想或不能使用异常,您可以在类中编写 __new__
方法 -
在 Python 中,__init__
在技术上是一种“初始化程序”方法 - 它应该填充属性并获取一些资源以及对象在其生命周期中需要的其他资源 - 然而,Python 确实定义了一个真正的构造函数,__new__
方法,它在 __init__
之前被调用 - 与此不同的是,__new__
实际上确实返回一个值:新创建的(未初始化的) ) 实例本身。
因此,您可以将检查放在 __new__
中,如果失败则简单地返回 None - 否则,返回调用父类(super class) __new__
方法的结果(一个可以在纯 Python 中不为对象进行实际的内存分配,因此最终您必须调用父类(super class)中用 native 代码编写的构造函数 - 通常这是类层次结构基础中的 object.__new__
.
注意:在 Python 2 中,您必须将 object
作为层次结构的基类 - 否则不仅 __new__
不会被调用,因为后来添加到 Python 对象的大量功能将无法正常工作。简而言之,class MyClass(object):
,永远不要 class MyClass:
- 除非你使用的是 Python3。
关于Python __init__ 返回创建失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17332929/