[英]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.