In the following program, at what point does my program call the _str__ method/constructor? I don't see it specifically being called at any point. I know it happens with this line print

"Printing crit1:"
print crit1

but I still don't see how or when this happens. Thanks for any and all help.

# Attribute Critter
# Demonstrates creating and accessing object attributes

class Critter(object):
    """A virtuaal pet"""
    def __init__(self, name):
        print "A new critter has been born!"
        
        self.name = name
        
    def __str__(self):
        rep = "Critter object\n"
        rep += "name: " + self.name + "\n"
        return rep
    
    def talk(self):
        print "Hi. I'm", self.name, "\n"
        
# main

crit1 = Critter("Poochie")
crit1.talk()

crit2 = Critter("Randolph") 
crit2.talk()

print "Printing crit1:"
print crit1

print "Directly accessing crit1.name:"
print crit1.name

raw_input("\n\nPress the enter key to exit.")

Dani AI

Generated

A few clarifications that should make the behavior obvious.

__init__ is the constructor — it runs when the object is created. __str__ is not a constructor; it’s a special method Python calls when it needs a human-readable string for an object (for example when you call str(obj) or use print obj). As and noted, print triggers that conversion; adding a temporary print statement inside __str__ (the debugging trick suggested) is an effective way to see when it runs.

There’s an important sibling method, __repr__, which is used for unambiguous/debug output. The interactive prompt and container displays (e.g., print [obj]) use __repr__, not __str__. If you only implement __str__, Python will fall back to __repr__; if you only implement __repr__, str() will use it as a fallback. So implement both if you want controlled outputs in both contexts.

A compact example to experiment with:

class Critter(object):
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return "<Critter '{}' >".format(self.name)

c = Critter("Poochie")
print c         # calls __str__ if present, otherwise falls back to __repr__
print [c]       # list displays use __repr__
print str(c), repr(c)

Practical tips: put a transient print inside __str__ to confirm when it runs; remember Python 3 uses print() and input() but the __str__/__repr__ behavior is the same; for best practice make __repr__ terse and unambiguous (useful for debugging) and __str__ user-friendly. This addresses the constructor/method confusion in ’s original code.

Recommended Answers

All 2 Replies

__str__() does operator overloading in a class and "hijacks" str() in any class instance operation that uses str(). So print crit1 will use it, because it uses str() to make it printable. Whereas is already printable.

Add this in line 12 and I think you'll see it getting called.

print "__str__ has been called."

The __str__ is called when you try to turn something that is not a string (in this case a critter) into a string. So when you print critter, python first tries to figure out how to turn a critter into a string which is what the __str__ is for. That is when and why python calls your __str__ function.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.