我不知道如何使__slots__工作

时间:2011-02-01 09:15:50

标签: python

为什么这段代码会为我运行?

class Foo():
    __slots__ = []
    def __init__(self):
        self.should_not_work = "or does it?"
        print "This code does not run,",self.should_not_work

Foo()

我认为广告位是一种限制。我正在运行Python 2.6.6。

2 个答案:

答案 0 :(得分:9)

__slots__提供了一个小的内存使用优化,因为它可以阻止分配__dict__来存储实例的属性。如果您有大量实例,这可能很有用。

您所谈论的限制主要是其实施方式的偶然副作用。特别是,如果您的类继承自没有__dict__的基类(例如__dict__),它只会停止创建object,即使这样,它也不会停止__dict__ 1}}在任何子类中分配,除非它们也定义__slots__。它不是一种安全机制,因此最好不要尝试使用它。

所有旧式课程都会自动获得__dict__,因此__slots__无效。如果你继承自object,你将获得你想要的效果,但基本上不要打扰__slots__,直到你知道你有数百万个实例并且内存是个问题。

答案 1 :(得分:8)

__slots__机制适用于新式类。您应该继承object

将班级声明更改为

class Foo(object):
  # etc...