gpt4 book ai didi

python - 为什么不只是 __new__ 而不是 __new__ 和 __init__ 在 python 中?

转载 作者:行者123 更新时间:2023-11-28 22:51:23 25 4
gpt4 key购买 nike

假设以下代码:

class NumStorage(object):

def __new__(cls, *nargs):
name = cls.__name__
parents = cls.__bases__
kwargs = {'num%i' % pos : i for pos, i in enumerate(nargs, 1)}
if any(kwargs.values()) and len(kwargs.values()) >= 2:
end = len(kwargs.values()) + 1
kwargs['num%i' % end] = sum(kwargs.values())
self = type(name, parents, kwargs)
return self

这个 NumStorage 对象接受任意数量的数字,如果有两个或更多数字并且它们的总和大于 0,那么它会创建一个新的 kwarg 键。

如果 NumStorage 实例的初始化可以在 __new__ 中进行,那么为什么 python 甚至需要 __init__?另一件事让我感到困惑;如果我们确实将 __init__ 方法添加到 NumStorage 类:

class NumStorage(object):

def __new__(cls, *nargs):
name = cls.__name__
parents = cls.__bases__
kwargs = {'num%i' % pos : i for pos, i in enumerate(nargs, 1)}
if any(kwargs.values()) and len(kwargs.values()) >= 2:
end = len(kwargs.values()) + 1
kwargs['num%i' % end] = sum(kwargs.values())
self = type(name, parents, kwargs)
return self

def __init__(self, *nargs):
print("initializing")

即使 __init__ 应该在 __new__ 之后调用,它也从不打印“正在初始化”,因为 __new__ 返回了对象的一个​​实例,不是吗?如果不是,我对它感到困惑的是什么?

最佳答案

__init__ 先来。 __new__ 主要添加到......好吧,我会让 documentation解释:

__new__() is intended mainly to allow subclasses of immutable types (like int, str, or tuple) to customize instance creation. It is also commonly overridden in custom metaclasses in order to customize class creation.

__init__ 对于旧式类系统来说已经足够好了。即使您子类化了一个“不可变的”旧式类,您也只需向父类(super class)的 __init__ 提供适当的参数。这不会用 tuple 的子类来削减它。

至于 __init__ 没有被调用:

If __new__() returns an instance of cls, then the new instance’s __init__() method will be invoked like __init__(self[, ...]), where self is the new instance and the remaining arguments are the same as were passed to __new__().

If __new__() does not return an instance of cls, then the new instance’s __init__() method will not be invoked.

关于python - 为什么不只是 __new__ 而不是 __new__ 和 __init__ 在 python 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21567071/

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