Python __init__返回创建失败

rjjhvcjd  于 2023-01-08  发布在  Python
关注(0)|答案(4)|浏览(330)

首先,我知道Python中类的__init__()函数不能返回值,所以很遗憾这个选项不可用。
由于我的代码结构,在类的__init__函数中包含数据Assert(并提示用户给予信息)是有意义的,但是,这意味着对象的创建可能会失败,我希望能够优雅地从中恢复。
我想知道继续这样做的最好方法是什么。我曾考虑过设置一个全局布尔值作为“有效构造”标志,但我宁愿不要。
还有其他想法吗(除了重新构造,使Assert可以在初始化之外发生,并且值作为参数传入)?我基本上是在寻找一种方法,使初始化期间成功时返回0,失败时返回-1。(像大多数C系统调用一样)

f8rj6qna

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。

igsr9ssn

igsr9ssn2#

你有没有考虑过引发一个异常?这是一个失败信号的常用方式。

qgelzfjb

qgelzfjb3#

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

flseospp

flseospp4#

我使用了一些技巧返回了__init__
下面介绍如何通过在__init__中出错来将错误设置为“try”。
下面是一个示例代码。

import sys

class MyClass(object):
    def __init__(self, test=None):
        if test is None:
            sys.exit(1)

        self.test = test
        print("do something __init__ here")

try:
    obj = MyClass()
except:
    obj = None

print(obj)

相关问题