通过重写python中的__new__来限制实例总数

时间:2019-01-30 10:20:51

标签: python

我正在阅读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中呢?

2 个答案:

答案 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__)

它可能会比这复杂一些,但是总的来说,这就是您调用类时发生的情况。