如何*不*创建实例

时间:2016-10-12 00:34:44

标签: python python-3.x

如果参数与预期值不匹配,我想避免创建实例 即简而言之:

#!/usr/bin/env python3

class Test(object):
    def __init__(self, reallydoit = True):
        if reallydoit:
            self.done = True
        else:
            return None

make_me = Test()
make_me_not = Test(reallydoit=False)

我希望make_me_notNone,我认为return None可以做到这一点,但这个变量也是Test的一个实例:

>>> make_me
<__main__.Test object at 0x7fd78c732390>
>>> make_me_not
<__main__.Test object at 0x7fd78c732470>

我确信有办法解决这个问题,但到目前为止,我的Google-fu还没有让我失望 感谢您的任何帮助。

编辑:我希望这可以默默处理;条件应该被解释为“最好不要创建这个特定的实例”而不是“你正在以错误的方式使用这个类”。所以是的,提出错误然后处理它是一种可能性,但我宁愿减少骚动。

1 个答案:

答案 0 :(得分:7)

raise方法中只有__init__例外:

class Test(object):
    def __init__(self, reallydoit = True):
        if reallydoit:
            self.done = True
        else:
            raise ValueError('Not really doing it')

另一种方法是将代码移至__new__方法:

class Test(object):
    def __new__(cls, reallydoit = True):
        if reallydoit:
            return object.__new__(cls)
        else:
            return None

最后,您可以将创建决策移至factory function

class Test(object):
    pass

def maybe_test(reallydoit=True):
    if reallydoit:
         return Test()
    return None