我不知道如何使__slots__工作

Mar*_*son 6 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()
Run Code Online (Sandbox Code Playgroud)

我认为插槽是一种限制.我正在运行Python 2.6.6.

Dun*_*can 9

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

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

所有旧式类都会__dict__自动生成,因此__slots__无效.如果你继承object你将获得你正在寻找的效果,但基本上不要打扰,__slots__直到你知道你有数百万的实例和内存是一个问题.


pki*_*kit 8

__slots__机制适用于新式类.你应该继承object.

将类声明更改为

class Foo(object):
  # etc...
Run Code Online (Sandbox Code Playgroud)