Home > python > Using __str__(), print all the attributes of an object

Using __str__(), print all the attributes of an object

Problem
I have a class which has some attributes. I use the objects of this class as “beans”, i.e. they simply group some data. When I print such an object, I want to see the variables as “name=value” pairs but I don’t want to code that manually. I want to iterate all the attributes and produce such a string representation of the object.

Solution
Attributes are stored in a dictionary-like __dict__ in the object. Furthermore, __dict__ contains only the user-provided attributes. Read more here. Thus, all we have to do is printing __dict__:

def __str__(self):
    sb = []
    for key in self.__dict__:
        sb.append("{key}='{value}'".format(key=key, value=self.__dict__[key]))

    return ', '.join(sb)

def __repr__(self):
    return self.__str__() 

A full example
Read an RSS feed and store item data in beans. Print the beans.

#!/usr/bin/env python

import untangle

XML = 'http://planet.python.org/rss20.xml'

from jabbapylib.text.ascii import unicode_to_ascii

class Item:
    def __init__(self, item):
        self.title = unicode_to_ascii(item.title.cdata)
        self.link = item.link.cdata

    def __str__(self):
        sb = []
        for key in self.__dict__:
            sb.append("{key}='{value}'".format(key=key, value=self.__dict__[key]))

        return ', '.join(sb)

    def __repr__(self):
        return self.__str__()

def main():
    li = []

    o = untangle.parse(XML)
    for item in o.rss.channel.item:
        if item.link.cdata:
            li.append(Item(item))

    for e in li:
        print e

if __name__ == "__main__":
    main()

Sample output:

link='http://techspot.zzzeek.org/2011/10/29/value-agnostic-types-part-ii', title='Michael Bayer: Value Agnostic Types, Part II'
...

To learn more about reading XMLs with untangle, see my previous post. The call unicode_to_ascii simply converts Unicode to ASCII characters, which is needed if you want to print the result on the terminal.

About these ads
  1. No comments yet.
  1. No trackbacks yet.
You must be logged in to post a comment.
Follow

Get every new post delivered to your Inbox.

Join 63 other followers

%d bloggers like this: