在__init__内终止对象创建的正确方法

时间:2014-11-12 21:29:38

标签: python python-2.7

这样做的最佳方法是什么。我有一个类对传递的参数进行一些完整性检查,如果某些事情未通过检查,我想创建对象失败,以便我可以在调用段中测试它。

示例:

class DoSomething(object):

    def __init__(self, _x, _y, _z)
        if _x < 0:
            return None
        #snip

    @property
    def x(self):
        return x

a = DoSomething(-1, 1, 2)

if not a:
    print "error"
else:
    print a.x

运行时,a仍然是有效的&#39;对象等&#34;打印a.x&#34;执行并抛出此错误:

Traceback (most recent call last):
  File "./c.1", line 19, in <module>
    print a.x
  File "./c.1", line 11, in x
    return x
NameError: global name 'x' is not defined

我想避免定义和提出自己的异常。我有什么方法可以做到这一点吗?

THX!

2 个答案:

答案 0 :(得分:5)

您可以将__new__用于此目的:

class DoSomething(object):
    def __new__(cls, _x, _y, _z):
        if _x < 0:
            return None
        return object.__new__(cls)

您无法在__init__中停止创建对象,因为该对象已经存在(self参数)。

上述例子:

>>> DoSomething(1, 2, 3)
<__main__.DoSomething object at 0x108b57e48>
>>> DoSomething(-1, 2, 3)
>>>

话虽如此,从__init__提出异常并尝试/除了它之外更常见:

try:
    obj = DoSomething(-1, 2, 3)
except MyException:
    pass

对于其他开发人员来说这更为直观(正如您有效地说的那样:用_x的负值来初始化对象是不可能的)。它还避免了Python的鲜为人知的功能(__new__),并且可以干净地处理异常。

答案 1 :(得分:1)

使用例外。 ValueError非常适合:

class DoSomething(object):

    def __init__(self, x, y, z)
        if x < 0:
            raise ValueError('x is negative')
        # snip
        self.x = x

try:
    a = DoSomething(-1, 1, 2)
except ValueError:
    print "error"
else:
    print a.x

顺便说一句,如果一个变量以_的约定开头,那么这个变量就不需要了,只是为了满足接口限制;只有以_开头的属性才意味着“不属于公共接口”。这里没有必要的财产。