防止在Python构造函数中创建对象
如何正确地拒绝在Python构造函数中创建对象?考虑一个对象:防止在Python构造函数中创建对象,python,oop,constructor,Python,Oop,Constructor,如何正确地拒绝在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._
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
类三角形:
定义初始化(self,a,b,c):
边=[a、b、c]
sides.sort()
如果边[0]+边[1]<边[2]:
一无所获
自我。_a=a
自我。_b=b
自我意识。_c=c
如果三角形的边不符合逻辑,我将拒绝创建三角形对象。返回None
不会阻止三角形对象的创建,返回False
会引发异常。正确的处理方法是什么?当给出错误的参数时,我是否应该抛出某种类型的异常?不允许从构造函数返回值(甚至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
类三角形:
定义初始化(self,a,b,c):
边=[a、b、c]
sides.sort()
如果边[0]+边[1]<边[2]:
提升值错误()
自我。_a=a
自我。_b=b
自我意识。_c=c
引发异常
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
哪一个更合适取决于抛出无效值应该是API的一部分(第一个版本),还是仅用于帮助查找程序员错误(第二个版本,因为如果您将
-O
“optimized”标志传递给python解释器,将跳过断言)。我还将向ValueError添加一条消息,例如,ValueError(“无效三角形”)@Arthur有点晚了,但我根据您的建议添加了一条消息
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