在创建对象时返回除对象之外的其他内容

时间:2012-03-15 14:28:21

标签: python class object initialization

我想创建一个知道不基于输入参数实例化的类。举个简单的例子,如果我想创建一个只有在其输入参数之一为>时才能存在的对象。 1然后

foo = new_object(0.1)

应该将None返回foo而不是对象。

它让我觉得它是一种创造对象的优雅方式,因为这意味着我不需要在课外讨论是否要创建它

有没有办法做到这一点,或同样有用,这是不好的做法,为什么?

3 个答案:

答案 0 :(得分:3)

您需要覆盖__new__ - 确保它采用与__init__相同的参数:

class Test(object):
    def __init__(self, value):
        self.value = value
    def __new__(cls, value):
        if value > 1:
            return object.__new__(cls)
        return None
    def __repr__(self):
        return "Test value %d" % self.value


t1 = Test(2)
print repr(t1)
t2 = Test(1)
print repr(t2)

Python支持从__new__返回不同类型的对象,但这是一种相当罕见的做法。

在您的用例中,如果您在

之间进行选择
if value < 1:
    foo = None
else:
    foo = Test(value)

foo = Test(value)  # will None if value <= 1

这是你必须要做的很多次,然后我肯定会考虑让这个课做。

在您无法控制new_object的情况下,您可以自行创建工厂:

def maybe_foo(value):
    if value > 1:
        return new_object(value)
    return None

答案 1 :(得分:2)

您可以覆盖__new__()以有效地将对象实例化转换为类似工厂的操作,就像您想要在此处执行一样。我有时喜欢使用抽象基类的__new__()作为具体子类的工厂,只要具体子类列表可以被限制和已知。只要确保它是您问题的最佳解决方案,因为它可能不是......

答案 2 :(得分:1)

很明显,这将是一个不好的做法,原因很简单,没有人像这样做。调用构造函数应该构造对象实例,而不是有选择地决定它是否想要。在构造对象时,您不应该检查失败。因此它具有相当高的“wtf配额”,这绝不是一个好主意。

那就是说,我不确定它是否可能,因为__init__()在实例已经创建后运行(并且不以return self结束)。这是Python,我确信可以纠结一些事情。我的观点是,这样做是个坏主意。