我想创建一个知道不基于输入参数实例化的类。举个简单的例子,如果我想创建一个只有在其输入参数之一为>时才能存在的对象。 1然后
foo = new_object(0.1)
应该将None
返回foo
而不是对象。
它让我觉得它是一种创造对象的优雅方式,因为这意味着我不需要在课外讨论是否要创建它
有没有办法做到这一点,或同样有用,这是不好的做法,为什么?
答案 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)
那就是说,我不确定它是否可能,因为__init__()
在实例已经创建后运行(并且不以return self
结束)。这是Python,我确信可以纠结一些事情。我的观点是,这样做是个坏主意。