setattr question
bruno at modulix
onurb at xiludom.gro
Thu Mar 2 13:11:00 EST 2006
Gerard Flanagan wrote:
> Hello
>
> I have the following code:
>
> #### builder.py #########
> class HtmlBuilder(object):
>
> @staticmethod
> def page(title=''):
> return HtmlPage(title)
>
> @staticmethod
> def element(tag, text=None, **attribs):
> return HtmlElement(tag, text, **attribs)
>
> @staticmethod
> def literal(text):
> return HtmlLiteral(text)
Je ne vois pas très bien à quoi sert cette classe (à moins bien sûr
qu'il y ait d'autre code). Pour ce que je vois là, pourquoi ne pas
appeler directement les classes HtmlPage, HtmlElement et HtmlLiteral ?
Err... I don't see the point of this class. Why not just calling the
HtmlPage|Element|Literal classes directly ?
> class HtmlElementFactory(object):
>
> def __init__(self):
> for tag in ['li', 'ul']:
> setattr( self, tag, HtmlBuilder.element(tag) )
>
> #########################
>
> and so I can do the following:
>
> html = HtmlElementFactory()
> ul = html.ul
> ul.attrib['class'] = 'default'
> for i in range(3):
> li = html.li
> li.text = 'ghfhj'
> ul.append(li)
> print ul.to_string()
>
> but what I'd like to do is:
>
> html = HtmlElementFactory()
> ul = html.ul( class='default' )
> for i in range(3):
> ul.append( html.li( 'ghfhj' )
> print ul.to_string()
'to_string' ?
Let's see... 'to_string', a class with only staticmethods in it...
You're coming from Java, aren't you ?-)
(if yes, google for "python is not java", it may be helpful)
> ie. to pass along *args and **kwargs to the HtmlElement constructor.
> Any suggestions?
yes : pass along *args and **kwargs to the HtmlElement constructor !-)
> Or is there a better way to this kind of thing?
yes again : kiss (Keep It Simple Stupid)
There's not enough code to really grasp what you're trying to do, but
from what I see, I'd say you're having a bad case of arbitrary
overcomplexification.
What's wrong with:
# nb: class is a reserved word in Python
ul = HtmlElement('ul', css_class='default')
for i in range(3):
ul.append(HtmlElement('li', 'baaz%d' % i)
# nb2: use the __str__() method of HtmlElement
print str(ul)
Python's philosophy is to make simple things simple (don't worry,
there's still space for complex things -> descriptors, metaclasses etc).
HTH
--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'onurb at xiludom.gro'.split('@')])"
More information about the Python-list
mailing list