gpt4 book ai didi

python - 如何用不同的对象替换 __init__() 中的实例?

转载 作者:IT老高 更新时间:2023-10-28 21:05:46 26 4
gpt4 key购买 nike

我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com