我正在阅读blog post,以了解在Python中覆盖__new__
的示例。但是,我不理解以下示例:
class LimitedInstances(object):
_instances = [] # Keep track of instance reference
limit = 5
def __new__(cls, *args, **kwargs):
if not len(cls._instances) <= cls.limit:
raise RuntimeError, "Count not create instance. Limit %s reached" % cls.limit
instance = object.__new__(cls, *args, **kwargs)
cls._instances.append(instance)
return instance
def __del__(self):
# Remove instance from _instances
self._instance.remove(self)
调用object.__new__(cls, *args, **kwargs)
是否会导致无限递归?另外,我看到了__new__
actually happens before an object exists。那么究竟是什么存储在cls
中呢?
答案 0 :(得分:1)
调用
object.__new__(cls, *args, **kwargs)
是否会导致无限递归?
不,为什么? object.__new__
不是LimitedInstances.__new__
,也不会调用LimitedInstances.__new__
。
nb:最好使用super()
而不是对object
进行硬编码,但这无关紧要。
此外,我看到新实际上是在对象存在之前发生的。
实际上-__new__
是真正的构造函数-它的职责恰恰是创建cls
的新(未初始化)实例。
那cls中到底存储了什么?
类本身(在您的情况下为LimitedInstances
)。您怎么知道(嗯,object.__new__
会知道)应该实例化哪个类?-)
答案 1 :(得分:0)
在object.__new__
中调用LimitedInstances.__new__
不会引起无限递归,因为它们是不同的函数,并且object.__new__
不会回调到LimitedInstances.__new__
。通话费用看起来像:
LimitedInstances()
LimitedInstances.__new__(LimitedInstances)
object.__new__(LimitedInstances)
object.__init__(instance) # (as there is not LimitedInstances.__init__)
它可能会比这复杂一些,但是总的来说,这就是您调用类时发生的情况。