【发布时间】:2014-03-01 06:47:50
【问题描述】:
假设以下代码:
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__ 返回了对象的一个实例,不是吗?如果不是,我对什么感到困惑?
【问题讨论】:
-
感谢您提供这些资源!在发布这个问题之前,我查看了很多东西,但从未遇到过这些问题,它们消除了我的很多困惑。
标签: python