【问题标题】:Storing collection information in a class在类中存储集合信息
【发布时间】:2019-10-16 01:26:33
【问题描述】:

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

class ModelManager:
    MAX_OBJECTS = 10
    OBJECTS = {} # hash to model object
    NUM_OBJECTS = len(OBJECTS) # how to dynamically calculate this?

每次创建对象时,它都会添加到OBJECTS,每次删除时,它都会从OBJECTS 中弹出。

我该如何正确地在此处使用NUM_OBJECTS?理想情况下,它应该是充当计算的类方法/属性。对于像上面这样的事情,最好的方法是什么?

我想叫它ModelManager.NUM_OBJECTS

【问题讨论】:

    标签: python python-3.x collections


    【解决方案1】:

    使用计算出的property

    class ModelManager:
    
        @property
        def NUM_OBJECTS(self):
            return len(self.OBJECTS)
    

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

    如果您希望能够在您的班级周围调用len(除了NUM_OBJECTS) - 您可以overkill 使用元类:

    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:差不多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 2018-02-13
    • 2015-11-08
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多