Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止在Python构造函数中创建对象_Python_Oop_Constructor - Fatal编程技术网

防止在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._

如何正确地拒绝在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
类三角形:
定义初始化(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