Like I say, I haven't done much with Django and I don't have it on my system right now to play with. Also I'm not sure what you are doing to display the Reptile objects. But according to the
Django docs the __unicode__() method (two underscores on either side) is called:
"whenever you call unicode() on an object. Django uses unicode(obj) (or the related function, str(obj)) in a number of places. Most notably, to display an object in the Django admin site and as the value inserted into a template when it displays an object. Thus, you should always return a nice, human-readable representation of the model from the __unicode__() method."
My guess is that there is no magic going on here to identify "available" as the name of your ReptileSpecies; you have simply told the __unicode__() method to print the value of that attribute and Django expects to call __unicode__() as the default mechanism for displaying the object.
Incidentally, there are various other methods/variables in Python that start/end with two underscores and are typically used internally in Python (or frameworks like Django) like this, so be sure to count those underscores.
Meanwhile, if you try a dummy class (not based on a Django model) with a couple of member attributes and try to print them using the __unicode__() method, you get different results if you forget the parens on the method call. Calling it with parens tells Python you want to execute the method; calling it without parens tells Python you simply want a reference to the method (which is treated like any other member of the class):
The results are:
Hope this helps.
PS: There are lots of good free materials for learning Python online e.g. you could look at the courses on Coursera. But if you're prepared to spend a few quid/dollars/your currency of choice on a book, I would recommend
Head First Python as a great quick introduction to Python for total beginners, including a brief look at non-beginner's topics like Django and Google App engine.