07A More on Python objects: help, double-underscore functions

> Hi. This is a question pertaining to Lesson 7.
> It is about functions I find in python 'help'.
>
> In interactive mode, let's say I create a simple list named 'mylist'.
> I type dir() and I can see that it is there.
> I type help (mylist).

dir() is a good thing to know about -- I should have mentioned that.
It gives you a list of all the functions in a class.

> This puts me in Help on list objects.
> First I get some methods (__add__, __contains__, and so on).
> Then come entries which do not have double underscores on either side
> (append, count, etc.).
>
> I have learned from Lesson 7 how to use the latter (e.g., mylist.append,
> mylist.count).
>
> Here is my question. I don't understand how to use the ones with double
> underscores around them. The only example we saw of such a creature in
> this lesson is __init__.

The double-underscore things are generally functions that aren't
called by name, but are called in response to some other operation.
For instance, you know __init__() is called when you create an object
of that class.

So if you look at dir(mylist), you'll see things like __add__,
which gets called if you add two lists. If you say
>>> mylist = [1, 2]
>>> mylist + [3, 4]
[1, 2, 3, 4]

then internally, when Python sees the +, it looks for an __add__()
function in the list class, and calls it.

__contains__() is anothe one you'll see there: it gets called if you
do something like "if 2 in mylist:"
>>> 2 in mylist
True

You can call those double-underscore functions directly if you
want to, though generally you won't need to. This is the same as
the previous "2 in mylist":
>>> mylist.__contains__(2)
True

You can probably guess what a lot of the special functions do, like
__lt__ and _gt__ (corresponding to the < and > operators),
__mul__ (the * operator), and __len__ (len(object)). Others are
not so obvious. Here's a long list of these special
double-underscore functions you can define if you want them:
http://docs.python.org/reference/datamodel.html#basic-customization

One important one that a lot of classes need is a way of converting
themselves to a string. If you're debugging and you want to know
what your object contains, and you print myobject, you'll typically
get something like
<__main__.MyClass instance at 0x91491ec>

Not very helpful when you want to know what's inside it! But you
define the special class function __repr__() (for "representation) to
return a readable string representation of your object:

class FlashCardViewer:
def __repr__(self):
Return "FlashCardViewer containing %d flashcards" % (self.num_cards)

You may have noticed that there's also a __str__() function for
converting your class to a string. But __repr__() is more general
than __str__() -- it works for "informal" conversions too, like if
you're debugging in the Python console and want to see what's inside
your object, as well as places where someone formally calls
str(object) to convert to a string. If you define __repr__, it will
work everywhere __str__ will plus more.

Thanks for asking this question! I'd long been meaning to look for
the full list of double-underscore functions but needed the push to
go find it, so this will help me too. :-)