14

首先,我知道__init__()Python 中类的函数不能返回值,所以很遗憾这个选项不可用。

__init__由于我的代码结构,在类的函数中包含数据断言(并提示用户提供信息)是有意义的。但是,这意味着对象的创建可能会失败,我希望能够优雅地从中恢复。

我想知道继续这样做的最佳方法是什么。我考虑过将全局布尔值设置为“有效构造”标志,但我不希望这样做。

任何其他想法(除了重组,因此断言可以在初始化之外发生并且值作为参数传入)?我基本上是在寻找一种在初始化期间成功返回 0 并在失败时返回 -1 的方法。(像大多数 C 系统调用一样)

4

3 回答 3

17

当 assertio 失败时,您可以引发异常,或者 - 如果您真的不想要或不能处理异常,您可以 __new__在类中编写该方法 - 在 Python 中,__init__技术上是一种“初始化程序”方法 - 它应该填写属性并获取对象在其生命周期中需要的一些资源和其他资源 - 但是,Python 确实定义了一个真正的构造函数,该__new__方法在之前调用__init__- 与此不同的是,它__new__实际上确实返回了一个值:新创建的(未初始化的)实例本身。

所以你可以把你的检查放在里面__new__,然后简单地返回 None 是什么失败 - 否则,将调用的结果返回给超类__new__方法(不能在纯 Python 中为对象进行实际的内存分配,所以最终你必须在超类中调用用本机代码编写的构造函数 - 通常这是object.__new__在类层次结构的基础中。

注意:在 Python 2 中,您必须将object其作为层次结构的基类 - 否则不仅__new__不会调用,而且后来添加到 Python 对象的大量功能将无法正常工作。简而言之,class MyClass(object):永远不会class MyClass:- 除非您使用的是 Python3。

于 2013-06-27T01:13:43.560 回答
2

您是否考虑过提出异常?这是发出失败信号的常用方法。

于 2013-06-27T01:07:07.957 回答
0

写一个@classmethod 函数怎么样?然后,您可以检查所有条件并创建和初始化一个新类,或者返回 None。然后调用函数只需要检查返回的类是否不是 None。

于 2022-01-26T15:24:22.427 回答