Steven D'Aprano <[EMAIL PROTECTED]> writes: > Well, I've read the thread, and I've read the thread it links to, > and for the life of me I'm still no clearer as to why __slots__ > shouldn't be used except that: [...] > But is there actually anything *harmful* that can happen if I use > __slots__?
Here is one harmful consequence: __slots__ breaks multiple inheritance: class A(object): __slots__ = ['a', 'b'] class B(object): __slots__ = ['c'] class AB(A, B): pass Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: Error when calling the metaclass bases multiple bases have instance lay-out conflict Even if A and B had the exact same slots, for example ['a', 'b'], it wouldn't make a difference. AB explicitly setting __slots__ to something like ['a', 'b', 'c'] doesn't help either. But that is only a technical answer to your technical question which misses the real problem people like Aahz and Guido have with __slots__. (I don't claim to represent them, of course, the following is my interpretation.) The backlash against __slots__ is a consequence of it being so easy to misunderstand what __slots__ does and why it exists. Seeing __slots__ has led some people to recommend __slots__ to beginners as a way to "catch spelling mistakes", or as a way to turn Python's classes into member-declared structures, a la Java. For people coming from Java background, catching mistakes as early as possible is almost a dogma, and they are prone to accept the use of __slots__ (and living with the shortcomings) as a rule. Python power users scoff at that because it goes against everything that makes Python Python. Use of __slots__ greatly reduces class flexibility, by both disabling __dict__ and __weakref__ by default, and by forcing a tight instance layout that cripples inheritance. With people using __slots__ for the majority of their classes, it becomes much harder for 3rd-party code to attach an unforeseen attribute to an existing object. Even with single inheritance, __slots__ has unintuitive semantics because subclasses automatically get __dict__ and __weakref__, thereby easily breaking the "benefits" of their use. __slots__ is a low-level tool that allows creation of dict-less objects without resorting to Python/C. As long as one understands it as such, there is no problem with using it. -- http://mail.python.org/mailman/listinfo/python-list