阻止在Python构造函数中创建对象

时间:2013-06-26 07:25:00

标签: 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._c = c

如果三角形的边不合逻辑,我想拒绝创建三角形对象。返回None不会阻止创建Triangle对象,并且返回False会引发异常。处理这个问题的正确方法是什么?当给出错误的参数时,我应该抛出某种类型的异常吗?

2 个答案:

答案 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