在用Python编写的基于代理的模型中使用__slots__

时间:2014-08-27 16:09:11

标签: python agent agent-based-modeling

我有兴趣在Python中构建agent-based models经济系统。典型的模型可能有数千个代理(即公司,消费者等)。

典型的公司代理类可能类似于:

class Firm(object):

    def __init__(capital, labor, productivity):
        self.capital = capital
        self.labor = labor
        self.productivity = productivity

在我的大多数模型中,属性不是动态创建的,因此我可以使用__slots__编写类:

class Firm(object):
    __slots__ = ('capital', 'labor', 'productivity')

    def __init__(capital, labor, productivity):
        self.capital = capital
        self.labor = labor
        self.productivity = productivity

但是,seems通常不鼓励使用__slots__。我想知道这是__slots__的合法/可取的用例。

1 个答案:

答案 0 :(得分:6)

__slots__功能专门用于在创建大量实例时保存内存。引用__slots__ documenation

  

默认情况下,旧式和新式类的实例都有一个属性存储字典。这会浪费具有很少实例变量的对象的空间。在创建大量实例时,空间消耗会变得很严重。

     

可以通过在新样式类定义中定义__slots__来覆盖默认值。 __slots__声明采用一系列实例变量,并在每个实例中保留足够的空间来保存每个变量的值。保存空间是因为没有为每个实例创建__dict__

听起来你正在使用插槽完全正确的原因

不鼓励使用__slots__作为无动态属性的副作用;你应该使用元类代替。