Why do descriptors (and thus properties) only work on attributes.

Steven Bethard steven.bethard at gmail.com
Tue Mar 1 01:00:39 CET 2005


Antoon Pardon wrote:
> Can anyone explain why descriptors only work when they are an attribute
> to an object or class.  I think a lot of interesting things one can
> do with descriptors would be just as interesting if the object stood
> on itself instead of being an attribute to an other object.

Not sure what "stood on itself" really means, but if you just want to be 
able to have module-level properties, you can do something like:

py> class Module(object):
...     oldimporter = __builtins__.__import__
...     def __init__(self, *args):
...         mod = self.oldimporter(*args)
...         self.__dict__ = mod.__dict__
...     p = property(lambda self: 42)
...
py> __builtins__.__import__ = Module
py> import __main__
py> __main__.p
42
py> __main__.p = 3
Traceback (most recent call last):
   File "<interactive input>", line 1, in ?
AttributeError: can't set attribute

where you replace module objects with a different object.  Note that 
this is also nasty since properties reside in the class, so all modules 
now share the same properties:

py> import sys
py> sys.p
42
py> sys.p = 13
Traceback (most recent call last):
   File "<interactive input>", line 1, in ?
AttributeError: can't set attribute

STeVe



More information about the Python-list mailing list