[Python-Dev] Meta-reflections

Greg Ward gward@python.net
Mon, 18 Feb 2002 20:14:19 -0500

On 18 February 2002, Kevin Jacobs said:
> My recent post on __slots__ not being picklable (and the resounding lack of
> response to it)

Certainly caught my attention, but I had nothing to add.

>   1) Should class instances explicitly/directly know all of their attributes?

I'm not sure you're asking the right question.  If you're concerned with
introspection, shouldn't the question be: "Should arbitrary code be able
to find out the set of attributes associated with a given object?"  The
Pythonic answer is clearly yes.  And if "attribute" means "something
that follows a dot", then you can do this using dir().  Unfortunately,
the expansion of dir() to include methods means it's no longer very
useful for getting just instance attributes, whether they're in a
__dict__ or some other method.

So the obvious answer is to use vars(), which works on classic classes
and __slots__-less new-style classes.  (I think vars(x) is just a more
sociable way to spell x.__dict__.)  But it bombs on classes with

>>> class C(object):
...   __slots__ = ['a', 'b']
>>> c = C()
>>> vars(c)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: vars() argument must have __dict__ attribute

Uh-oh.  This is a problem.

>   3) Should __slots__ be immutable?

Yes, definitely.  Clearly __slots__ is a property of the type (class),
not of the instance, and once the class is defined, that's it.  (Or that
should be it.)  It looks as though you can modify __slots__, but it has
no effect; that's mildly bogus.

>   4) Should __slots__ be flat?

Hmmmm... probably.  That's certainly consistent with "... once the class
is defined, that's it".

Greg Ward - geek-at-large                               gward@python.net
If you and a friend are being chased by a lion, it is not necessary to
outrun the lion.  It is only necessary to outrun your friend.