首先,我知道Python中某个类的__init__()
函数无法返回值,所以遗憾的是这个选项不可用。
由于我的代码结构,在类的__init__
函数内部进行数据断言(以及提示用户提供信息)是有意义的。但是,这意味着对象的创建可能会失败,我希望能够从此优雅地恢复。
我想知道继续这个的最佳方法是什么。我已经考虑将全局布尔值设置为“有效构造”标志,但我不想这样做。
任何其他想法(除了重构之外,所以断言可以在初始化之外发生,值是作为参数传递的)?我基本上是在寻找一种方法,在成功时返回0并在初始化期间返回-1。 (像大多数C系统调用一样)
答案 0 :(得分:13)
当assertio失败时,你可以引发异常,或者 - 如果你真的不想或不能使用异常,你可以在你的类中编写__new__
方法 -
在Python中,__init__
在技术上是一个“初始化器”方法 - 它应该填充属性并获取一些资源以及你的对象在其生命周期中需要的其他资源 - 但是,Python确实定义了一个真正的构造函数, __new__
之前调用的__init__
方法 - 与此不同,__new__
实际上会返回一个值:新创建的(未初始化的)实例本身。
所以你可以把你的支票放在__new__
里面然后简单地返回None就会失败 - 否则,将调用的结果返回给超类__new__
方法(一个人不能做实际的记忆在纯Python中为对象分配,所以最终你必须在超类中调用用本机代码编写的构造函数 - 通常在类层次结构的基础上是object.__new__
。
NB :在Python 2中,您必须将object
作为层次结构的基类 - 否则不仅会调用__new__
,因为很多功能稍后添加到Python对象将无法正常工作。简而言之,class MyClass(object):
,永远不会class MyClass:
- 除非您使用的是Python3。
答案 1 :(得分:1)
您是否考虑过提出异常?这是表示失败的通常方式。