So as part of problem 17.6 in “Think Like a Computer Scientist”, I’ve written a class called Kangaroo:
class Kangaroo(object):
def __init__(self, pouch_contents = []):
self.pouch_contents = pouch_contents
def __str__(self):
'''
>>> kanga = Kangaroo()
>>> kanga.put_in_pouch('olfactory')
>>> kanga.put_in_pouch(7)
>>> kanga.put_in_pouch(8)
>>> kanga.put_in_pouch(9)
>>> print kanga
"In kanga's pouch there is: ['olfactory', 7, 8, 9]"
'''
return "In %s's pouch there is: %s" % (object.__str__(self), self.pouch_contents)
def put_in_pouch(self, other):
'''
>>> kanga = Kangaroo()
>>> kanga.put_in_pouch('olfactory')
>>> kanga.put_in_pouch(7)
>>> kanga.put_in_pouch(8)
>>> kanga.put_in_pouch(9)
>>> kanga.pouch_contents
['olfactory', 7, 8, 9]
'''
self.pouch_contents.append(other)
What’s driving me nuts is that I’d like to be able to write a string method that would pass the unit test underneath __str__ as written. What I’m getting now instead is:
In <__main__.Kangaroo object at 0x4dd870>'s pouch there is: ['olfactory', 7, 8, 9]
Bascially, what I’m wondering if there is some function that I can perform on kanga = Kangaroo such that the output of the function is those 5 characters, i.e. function(kanga) -> “kanga”.
Any ideas?
Edit:
Reading the first answer has made me realize that there is a more concise way to ask my original question. Is there a way to rewrite __init__ such that the following code is valid as written?
>>> somename = Kangaroo()
>>> somename.name
'somename'
I wasn’t going to post this but if you only want this for debugging then here you go:
This is dependent on CPython (AFAIK) and isn’t suitable for production code. It wont work if the instance is in any sort of container and may fail for any reason at any time. It should do the trick for you though.
It works by getting the
f_localsdictionary out of the stack frame that represents the namespace whereprint kangis called. The keys off_localsare the names of the variables in the frame so we just loop through it and test if each entry isself. If so, webreak. Ifbreakis not executed, then we didn’t find an entry and the loopselseclause assigns the value ‘roo’ as requested.If you want to get it out of a container of some sort, you need to extend this to look through any containers in
f_locals. You could either return the key if it’s a dictlike container or the index if it’s something like a tuple or list.