![](/img/trans.png)
[英]Django FloatField and DecimalField creation return different than object in database
[英]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.