繁体   English   中英

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

[英]Why not just __new__ and not __new__ and __init__ in python?

假设以下代码:

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__主要是添加到...好吧,我让文档解释:

__new__()主要用于允许不可变类型的子类(例如int,str或tuple)自定义实例创建。 为了自定义类的创建,它通常也被自定义元类覆盖。

对于老式的类系统, __init__几乎足够好。 即使您将“不可变的”旧类继承了子类,您也只需为超类的__init__提供适当的参数。 但这并不能用tuple子类来实现。

至于__init__没有被调用:

如果__new__()返回cls的实例,则将像__init__(self[, ...])一样调用新实例的__init__()方法,其中self是新实例,其余参数与传递给__new__()

如果__new__()没有返回cls的实例,则将不会调用新实例的__init__()方法。

python甚至需要 __init__吗?

不,python 不需要 __init__ ,但是如果只有__new__ ,则每次创建一个类时,都需要弄清楚__new__所有__new__

将两者分开可以使python更容易,并且更不易出错。

另外,历史上__init____new__之前。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM