我在 ClassA 中调用了一个构造函数,如果满足某个条件,我希望生成的对象属于不同的类 (ClassB)。我尝试将第一个参数替换为 __init__() (在下面的示例中为'self')within __init__() 但它似乎没有达到我想要的效果。
主要:
import ClassA
my_obj = ClassA.ClassA(500)
# unfortunately, my_obj is a ClassA, but I want a ClassB!
在 ClassA/__init__.py 中:
import ClassB
class ClassA:
def __init__(self,theirnumber):
if(theirnumber > 10):
# all big numbers should be ClassB objects:
self = ClassB.ClassB(theirnumber)
return
else:
# numbers under 10 are ok in ClassA.
return
在 ClassB/__init__.py 中:
class ClassB:
pass
最佳答案
您需要__new__()
为了那个原因。 (假设您使用的是 Python 2,您还需要通过子类化 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 黑魔法。)见 the documentation .
不过,在这种情况下,我会说工厂函数更合适,比如
def thingy(theirnumber):
if theirnumber > 10:
return ClassB.ClassB(theirnumber)
else:
return ClassA.ClassA(theirnumber)
顺便提一下,如果你按照我对 __new__()
所做的那样做上面,如果 ClassB
返回,__init__()
你在 ClassA
中写的方法不会在 ClassB
上调用实例!当您构建 ClassB
实例内部 ClassA.__new__()
, 自己的__init__()
方法( ClassB.__init__()
)将在那时运行,所以希望 Python 不应该运行另一个不相关的 __init__()
是有意义的。同一对象上的方法。但这可能会让人感到困惑,这可能是支持工厂函数方法的另一个论据。
关于python - 如何用不同的对象替换 __init__() 中的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3209233/