Python 在类中存储集合信息

Python 在类中存储集合信息,python,python-3.x,collections,Python,Python 3.x,Collections,我有一个ModelManager,它跟踪创建和销毁新对象。下面是一个例子: class ModelManager: MAX_OBJECTS = 10 OBJECTS = {} # hash to model object NUM_OBJECTS = len(OBJECTS) # how to dynamically calculate this? 每次创建对象时,它都会被添加到对象中,每次删除时,它都会从对象中弹出 我如何正确处理这里的NUM\u对象?理想情况下,它应该

我有一个
ModelManager
,它跟踪创建和销毁新对象。下面是一个例子:

class ModelManager:
    MAX_OBJECTS = 10
    OBJECTS = {} # hash to model object
    NUM_OBJECTS = len(OBJECTS) # how to dynamically calculate this?
每次创建对象时,它都会被添加到
对象中
,每次删除时,它都会从
对象中弹出

我如何正确处理这里的
NUM\u对象
?理想情况下,它应该是一个classmethod/属性来充当计算。做上述事情,最好的方法是什么

我想将其称为
ModelManager.NUM\u对象

使用计算的

另外,请注意,
对象
将在类实例之间共享,因为它是在类范围内初始化的字典。
NUM\u对象
属性要求初始化类。如果希望
NUM_OBJECTS
成为类的属性,请使用建议用于类属性的解决方案之一

如果您希望能够围绕您的类调用
len
(除了
NUM\u对象
),那么元类的使用可能会过度:

class ModelManagerMeta(type):

    def __len__(cls):
         return len(cls.OBJECTS)

    def NUM_OBJECTS(cls):
         return len(cls.OBJECTS)


class ModelManager(metaclass=ModelManagerMeta):

    MAX_OBJECTS = 10
    OBJECTS = {} # hash to model object
    ...

@David542:如果你不尝试让一个类做一个实例的工作,你会有一个更加流畅的体验。制作一个实例而不是直接使用这个类。如果您真的愿意,您可以将其设置为模块级全局。@user2357112您的意思是:
manager=ModelManager()
,然后使用它吗?@user2357112是正确的。否则,您可能必须在上面的元类中实现大部分“类”,才能使其按预期工作。这段代码令人困惑,并且滥用了元类(imo)@David542:。
class ModelManagerMeta(type):

    def __len__(cls):
         return len(cls.OBJECTS)

    def NUM_OBJECTS(cls):
         return len(cls.OBJECTS)


class ModelManager(metaclass=ModelManagerMeta):

    MAX_OBJECTS = 10
    OBJECTS = {} # hash to model object
    ...