properties + types, implementing meta-class desciptors elegantly?

Mike C. Fletcher mcfletch at rogers.com
Sun Jul 20 06:54:18 EDT 2003


Beni Cherniavsky wrote:

>Mike C. Fletcher wrote on 2003-07-19:
>
>  
>
>>    * finally, stores the value
>>          o tries to do what would have been done if there were no
>>            descriptor (with the new, coerced value)
>>          o does *not* create new names in the object's namespace (all
>>            names are documented w/ descriptors, there's not a lot of
>>            '_' prefixed names cluttering the namespace)
>>          o does *not* require a new dictionary/storage-object attribute
>>            for the object (the descriptor works like any other
>>            descriptor, a *stand-alone* object that replaces a regular
>>            attribute)
>>
>>It's that last part that I'd like to have a function/method to
>>accomplish.  That is, store (and obviously retrieve as well) attribute
>>values for objects, instances, types, classes, __slot__'d instances,
>>etceteras under a given name without triggering any of the __setattr__
>>machinery which defers to the __set__ method of the associated descriptor.
>>
>>I can work around the problem by violating either of those two bullet
>>points under "finally, stores the value", but I'm looking for something
>>that *doesn't* violate them.  See below for responses to particular
>>points...
>>
>>    
>>
>I didn't grasp your precise problem but I've been having some similar
>problems (without metaclasses however).  Two tricks:
>
>- Insert a dummy class into you heirarchy between object (or whatever
>  other superclass that doesn't have the properties yet and the class
>  where you install the properties.  Then you might be able to use
>  this class to access the underliying class dict without being
>  intercepted by the properties.  [I recall some problems with
>  properties vs. super, didn't follow them closely].
>
This violates the "does *not* require a new dictionary/storage-object 
attribute" constraint.  The super-class is just another way of spelling 
"special place to store data" within the class instance, albeit a nicely 
evil one :) .  I'm looking for something that doesn't require modifying 
classes to be property-aware just to add the properties, that is, a 
stand-alone property object should be able to do this stuff w/out 
requiring that the client objects know about the properties at all.

>- If you use __slots__, they are also implemented as properties.  So
>  if you define properties with the same name in the same class, you
>  lose all access to the raw slots.  The solution is similar: define
>  __slots__ in a superclass, hide them with properties in a sublass.
>  See http://www.technion.ac.il/~cben/python/streams.py for an
>  example.
>
Will look it up.  Basically, I'm not too worried about slotted instances 
yet.  I just think it should be part of whatever general solution Guido 
figures is best.

Have fun,
Mike

_______________________________________
  Mike C. Fletcher
  Designer, VR Plumber, Coder
  http://members.rogers.com/mcfletch/








More information about the Python-list mailing list