在python中,实现构造函数可能失败的类的正确方法是什么?

时间:2017-07-12 05:22:07

标签: python

例如,在构造函数中,我需要获取一些可能失败的资源,在这种情况下,该类不应该被实例化。

我应该在构造函数中抛出异常吗?

class Foo(object):
    def __init__(self):
        self.rsc = get_resource():
        assert self.rsc

并尝试在实例化代码中捕获它?

try:
    a = Foo()
except:
    a = None

然后,代码检查a是否为None。

2 个答案:

答案 0 :(得分:3)

将我之前的评论扩展为答案:

最好将资源添加为构造函数参数,如下所示:

class Foo(object):
    def __init__(self, rsc):
        self.rsc = rsc

这种方法有很多好处:

  • 构造函数不能再失败
  • 您不再拥有昂贵的构造函数
  • 您在Foo及其资源类型
  • 之间有更松散的耦合

如果您喜欢隐式获取资源的界面,那么很容易将其包装起来。像make_foo这样的简单函数会尝试自动获取资源,如果不能,则返回None(如果您愿意,则返回错误):

def make_foo():
    rsc = get_resource()
    if rsc:
        return Foo(rsc)
    else:
        return None

答案 1 :(得分:-3)

不是真正的问题,只需在try...except函数中添加init,并在发生故障时指定None之类的特定值,或添加其他功能

class Foo(object):
    def __init__(self):
        try:
            self.rsc = get_resource()
            self.success = True
        except:
            self.rsc = None
            self.success = False

a = Foo()
if a.success:
    print(a.rsc)
else:
    do_something_else()