delegation pattern via descriptor

Rami Chowdhury rami.chowdhury at gmail.com
Tue Jul 6 01:40:03 EDT 2010


On Monday 05 July 2010 21:10:51 kedra marbun wrote:
> On Jul 5, 3:42 pm, Bruno Desthuilliers <bruno.
> 
> 42.desthuilli... at websiteburo.invalid> wrote:
> > kedra marbun a écrit :
> > > i'm confused which part that doesn't make sense?
> > > this is my 2nd attempt to py, the 1st was on april this year, it was
> > > just a month, i'm afraid i haven't got the fundamentals right yet. so
> > > i'm gonna lay out how i got to this conclusion, CMIIW
> > > 
> > > **explanation of feeling (0) on my 1st post**
> > > to me, descriptor is a particular kind of delegation, it takes the job
> > > of coding the delegation by having a contract with programmers that
> > > the tree meta operations (get, set, del) on attr are delegated to the
> > > obj that is bound to the attr
> > > are we agree that descriptor is a kind of delegation?
> > > 
> > > the mechanism that makes descriptor works is in __getattribute__,
> > > __setattr__, __delattr__ of 'object' & 'type'
> > > 
> > > now, if i want a single descriptor obj to be delegated to multiple
> > > tasks, i can't do it since __get__ doesn't get info that can be used
> > > to determine which task to do
> > > i must have diff descriptor obj for each task
> > > 
> > > class Helper:
> > >    def __init__(self, name):
> > >            self.name = name
> > >    def __get__(self, ins, cls):
> > >            if self.name == 'task0': ...
> > >            elif self.name == 'task1': ...
> > >            else: ...
> > 
> > Replacing such "big switch" code with polymorphic dispatch is one of the
> >   goals (and feature) of OO. This should be:
> > 
> > class Task0(object):
> >      def __get__(self, obj, cls):
> >          # code here
> > 
> > class Task1(object):
> >      def __get__(self, obj, cls):
> >          # code here
> > 
> > class A(object):
> >      task0 = Task0()
> >      task1 = Task1()
> > 
> > If you have common code to share between TaskO and Task1 then factor it
> > out into a base class.
> > 
> > > if __get__ receives the name, then i could do
> > > 
> > > class Helper:
> > >    def __get__(self, ins, cls, name):
> > >            ...
> > > 
> > > class a:
> > >    task0 = task1 = Helper()
> > 
> > Yuck.
> 
> what's so 'Yuck' about it? ;)
> i guess i need a strong stmt: is descriptor a kind of delegation? or
> is it not?

Thanks for posting the code sample -- it makes your meaning a great deal 
clearer. No, descriptors are not delegation as in your sample**, although they 
are very flexible and could be used to implement that if you wanted.
 
> * if it's not, then there's nothing to be argued, the name
> 'descriptor' is perfectly fit: descriptor obj describes attr of class,
> with 'describe' translates to: . = del, in py vocabularies. then, to
> think a single descriptor obj describing a single attr is acceptable,
> it's a common sense

** As I understand it, anyway -- someone please correct me if I'm wrong.


----
Rami Chowdhury
"Never attribute to malice that which can be attributed to stupidity." --
Hanlon's Razor
+1-408-597-7068 / +44-7875-841-046 / +88-01819-245544



More information about the Python-list mailing list