首先,我知道Python中类的__init__()
函数不能返回值,所以很遗憾这个选项不可用。
由于我的代码结构,在类的__init__
函数中包含数据Assert(并提示用户给予信息)是有意义的,但是,这意味着对象的创建可能会失败,我希望能够优雅地从中恢复。
我想知道继续这样做的最好方法是什么。我曾考虑过设置一个全局布尔值作为“有效构造”标志,但我宁愿不要。
还有其他想法吗(除了重新构造,使Assert可以在初始化之外发生,并且值作为参数传入)?我基本上是在寻找一种方法,使初始化期间成功时返回0,失败时返回-1。(像大多数C系统调用一样)
4条答案
按热度按时间f8rj6qna1#
你可以在Assert失败时引发一个异常,或者--如果你真的不想或者不能处理异常,你可以在你的类中写
__new__
方法--在Python中,__init__
在技术上是一个“初始化器”方法--它应该填充属性,并获取一些资源和你的对象在其生命周期中需要的其他资源--然而,Python确实定义了一个真实的构造函数,即__new__
方法,它在__init__
之前被调用。与此不同的是,__new__
实际上确实返回了一个值:新创建的(未初始化的)示例本身。所以你可以把你的检查放在
__new__
和里面,如果失败了就简单地返回None--否则,返回调用超类__new__
方法的结果(在纯Python中不能为对象做实际的内存分配,所以最终你必须调用超类中用本机代码编写的构造函数--通常这是类层次结构的基类中的object.__new__
。NB:在Python 2中,你必须把
object
作为你层次结构的基类--否则不仅__new__
不会被调用,而且很多后来添加到Python对象中的特性也不会起作用。简而言之,class MyClass(object):
永远不会是class MyClass:
--除非你使用的是Python 3。igsr9ssn2#
你有没有考虑过引发一个异常?这是一个失败信号的常用方式。
qgelzfjb3#
写一个@classmethod函数怎么样?然后你可以检查所有的条件,或者创建并初始化一个新的类,或者返回None。调用函数只需要检查返回的类是否不是None。
flseospp4#
我使用了一些技巧返回了
__init__
。下面介绍如何通过在
__init__
中出错来将错误设置为“try”。下面是一个示例代码。