繁体   English   中英

在创建对象时返回对象以外的东西

[英]return something other than the object on creation of object

我想做一个知道不基于输入参数实例化的类。 对于一个简单的示例,如果我想创建一个仅在其输入参数之一大于1的情况下才能存在的对象,则

foo = new_object(0.1)

应该向foo而不是对象返回None

它给我一种创建对象的优雅方式,因为它意味着我不需要类外的代码来决定是否创建它

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

您需要重写__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

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

很明显,这是一个不好的做法,因为非常简单的原因是没有人会这样做。 调用构造函数应该构造对象实例,而不是选择性地确定是否想要。 构造对象时,您无需检查故障。 因此,它具有很高的“ wtf配额”,这绝不是一个好主意。

就是说,我不确定是否有可能,因为__init__()是在实例创建之后运行的(并且不会以return self结尾)。 这是Python,我敢肯定会发生争执。 我的观点是这样做不是一个好主意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM