如何正确拒绝在Python构造函数中创建对象?考虑一个对象:
class Triangle:
def __init__(self, a, b, c):
sides = [a, b, c]
sides.sort()
if sides[0]+sides[1] < sides[2]:
return None
self._a = a
self._b = b
self._c = c
如果三角形的边不合逻辑,我想拒绝创建三角形对象。返回None
不会阻止创建Triangle对象,并且返回False
会引发异常。处理这个问题的正确方法是什么?当给出错误的参数时,我应该抛出某种类型的异常吗?
答案 0 :(得分:7)
提出异常
class Triangle:
def __init__(self, a, b, c):
sides = [a, b, c]
sides.sort()
if sides[0]+sides[1] < sides[2]:
raise ValueError('invalid triangle!')
self._a = a
self._b = b
self._c = c
或使用断言(自身引发异常)
class Triangle:
def __init__(self, a, b, c):
sides = [a, b, c]
sides.sort()
assert sides[0]+sides[1] >= sides[2]
self._a = a
self._b = b
self._c = c
哪一个更合适取决于抛出无效值是否应该是您的API(第一个版本)的一部分,或者仅仅是为了帮助查找程序员错误(第二个版本,因为如果您传递{{{},则会跳过断言1}} python解释器的“optimized”标志。)
答案 1 :(得分:2)
不允许从构造函数返回值(偶数None
)
如你所知,应该提出例外。
class Triangle:
def __init__(self, a, b, c):
sides = [a, b, c]
sides.sort()
if sides[0]+sides[1] < sides[2]:
raise ValueError()
self._a = a
self._b = b
self._c = c