您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何用另一个对象替换__init __()中的实例?

如何用另一个对象替换__init __()中的实例?

您需要__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

其他 2022/1/1 18:34:33 有512人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶