design question: no new attributes

Bruno Desthuilliers bdesth.quelquechose at free.quelquepart.fr
Thu Mar 1 16:53:35 EST 2007


Alan Isaac a écrit :
> "Bruno Desthuilliers" <bdesth.quelquechose at free.quelquepart.fr> wrote in
> message news:45e60fdc$0$30655$426a34cc at news.free.fr...
> 
>>I don't share your definition of "reasonable". But you should have
>>guessed by now
> 
> 
> My view may be shaped by a different experience.
> I have found dynamic attribute creation convenient
> when doing something "quick and dirty", but I have
> never wanted it as a design feature in a more serious
> project.
> 
> Can you give me an example where design considerations
> make dynamic attribute creation particularly desirable?

Let's consider an imaginary ORM (or it could be an "object-ldap mapper", 
or just any other stuff where it may be useful to have 'smart 
attributes', like Plone's Archetype or FormEncode or...):

class Person(Schema):
    firstname = TextField(empty=False, format=str.capitalize)
    lastname = TextField(empty=False, format=str.upper)
    nickname = TextField(empty=False, format=str.lower, dbfield="login")

p = Person(firstname="joe", lastname="Hacker")

p.firstname
=> "Joe"
p.nickname
=> "joe"

p.fields['firstname'].dbfield
=> 'firstname'

I let you try to write the SchemaType metaclass without dynamically 
adding attributes to either the Person class (remember that classes are 
objects too) and/or the TextField instances...


Let's consider the controller part of a web MVC application. You want to 
manage security in a declarative way.

class PageController(Controller):
   @requires_perm('ViewContent')
   def view(self):
      # code here

   @requires_perm('EditContent'):
   def edit(self):
      # code here

etc...

What do you think this decorator will do ? yes, that's right: annotate 
the action methods with needed perms, so the relevant part of the 
framework can take appropriate action...



As a side note :  in Python, *all* attributes are "dynamically created". 
Class attributes are dynamically added to the class object by it's 
metaclass, instance attributes are dynamically added to the instance, 
usually - but not necessarily - by the __init__ method. Now the __init__ 
method is nothing more than a wrapper around the __init__ function, 
which itself takes the (bare) instance as argument. Writing methods 
within the class statement body makes things clearer, but is by no mean 
mandatory:

class Foo(object):
     pass

def init_foo(foo, name):
     foo.name = name

Foo.__init__ = init_foo


Like a lot of other tools (HOFs, metaclasses, descriptors, generators 
etc), dynamic attribute creation looks mostly like a useless gadget when 
you never used it before - because it's not part of your "mind map", you 
don't naturally use it in your design.

My 2 cents



More information about the Python-list mailing list