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

3
我对使用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

然而,似乎一般不鼓励使用__slots__。我想知道这是否是__slots__的合法/可取用例。
1个回答

6
__slots__ 功能专门用于在创建大量实例时节省内存。引用__slots__文档的说法:
“默认情况下,旧式和新式类的实例都具有属性存储的字典。这会浪费那些只有很少实例变量的对象的空间。当创建大量实例时,空间消耗可能变得严重。”
“可以通过在新式类定义中定义__slots__来覆盖默认值。 __slots__声明接受一系列实例变量,并为每个变量的每个实例保留足够的空间来保存值。因为不为每个实例创建__dict__,所以可以节省空间。”
听起来您正在出于恰当的原因使用__slots__
不鼓励使用__slots__作为无动态属性副作用的解决方案; 您应该改用元类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接