这样做的最佳方法是什么。我有一个类对传递的参数进行一些完整性检查,如果某些事情未通过检查,我想创建对象失败,以便我可以在调用段中测试它。
示例:
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!
答案 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
顺便说一句,如果一个变量以_
的约定开头,那么这个变量就不需要了,只是为了满足接口限制;只有以_
开头的属性才意味着“不属于公共接口”。这里没有必要的财产。