您需要__new__()
。(并且您还需要通过子类化使其成为一种新型类,假设您使用的是Python2 object
。)
class ClassA(object):
def __new__(cls,theirnumber):
if theirnumber > 10:
# all big numbers should be ClassB objects:
return ClassB.ClassB(theirnumber)
else:
# numbers under 10 are ok in ClassA.
return super(ClassA, cls).__new__(cls, theirnumber)
__new__()
在__init__()
。之前作为类实例化过程的一部分运行。基本上__new__()
是实际创建新实例的东西,__init__()
然后调用它初始化其属性。这就是为什么您可以使用__new__()
但不能__init__()
更改创建的对象的类型的原因:一旦__init__()
启动,该对象已经创建,并且更改其类型为时已晚。(嗯……不是真的,但是这成为了非常神秘的Python黑魔法。)请参阅文档。
def thingy(theirnumber):
if theirnumber > 10:
return ClassB.ClassB(theirnumber)
else:
return ClassA.ClassA(theirnumber)
顺便说一句,请注意,如果执行__new__()
上述操作,则ClassB
返回a时,将 不会 调用__init__()
该ClassB
实例的方法!Python仅在从返回的对象是其中包含方法的类的实例(在此处)时调用。这是支持工厂功能方法的另一个论点。 ____init__()``__new__()``__new__()``ClassA