【问题标题】:Prevent object from being created in Python constructor防止在 Python 构造函数中创建对象
【发布时间】:2013-06-23 05:34:15
【问题描述】:

如何正确地拒绝在 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 会引发异常。处理这个问题的正确方法是什么?当给定错误的参数时,我应该抛出某种类型的异常吗?

【问题讨论】:

    标签: python oop constructor


    【解决方案1】:

    要么引发异常

    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 的一部分(第一个版本),或者只是为了帮助查找程序员错误(第二个版本,如果您通过 @987654323 将跳过断言@python 解释器的“优化”标志)。

    【讨论】:

    • 我还会在 ValueError 中添加一条消息,例如 ValueError("Invalid triangle")
    • @Arthur 有点晚了,但我根据你的建议添加了一条消息
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2017-12-04
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 2011-05-22
      • 2012-02-05
      • 1970-01-01
      相关资源
      最近更新 更多