Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I change the string representation of a Python class? [duplicate]

In Java, I can override the toString() method of my class. Then Java's print function prints the string representation of the object defined by its toString(). Is there a Python equivalent to Java's toString()?

For example, I have a PlayCard class. I have an instance c of PlayCard. Now:

>>> print(c) <__main__.Card object at 0x01FD5D30> 

But what I want is something like:

>>> print(c) A♣ 

How do I customize the string representation of my class instances?

I'm using Python 3.x

like image 334
snakile Avatar asked Feb 06 '11 10:02

snakile


People also ask

What the __ repr __ function does?

Python __repr__() function returns the object representation in string format. This method is called when repr() function is invoked on the object. If possible, the string returned should be a valid Python expression that can be used to reconstruct the object again.

How do you modify a class in Python?

Built-in classes can't be modified, but you can "hide" a built-in class (or any other of course) by one of the same name. Note that bare literals like 'ciao' and 23 will still belong to the real classes -- there's no way to change that; you'll need to use str('ciao') and int(23) to use the "fake" classes.

What is the difference between repr and str in Python?

Now if you go by the official python documentation – the __str__ is used to find the “informal”(readable) string representation of an object whereas __repr__ is used to find the “official” string representation of an object.


2 Answers

The closest equivalent to Java's toString is to implement __str__ for your class. Put this in your class definition:

def __str__(self):      return "foo" 

You may also want to implement __repr__ to aid in debugging.

See here for more information:

  • Special Method Names - Basic Customization
like image 57
Mark Byers Avatar answered Sep 21 '22 06:09

Mark Byers


This is not as easy as it seems, some core library functions don't work when only str is overwritten (checked with Python 2.7), see this thread for examples How to make a class JSON serializable Also, try this

import json  class A(unicode):     def __str__(self):         return 'a'     def __unicode__(self):         return u'a'     def __repr__(self):         return 'a'  a = A() json.dumps(a) 

produces

'""' 

and not

'"a"' 

as would be expected.

EDIT: answering mchicago's comment:

unicode does not have any attributes -- it is an immutable string, the value of which is hidden and not available from high-level Python code. The json module uses re for generating the string representation which seems to have access to this internal attribute. Here's a simple example to justify this:

b = A('b') print b

produces

'a'

while

json.dumps({'b': b})

produces

{"b": "b"}

so you see that the internal representation is used by some native libraries, probably for performance reasons.

See also this for more details: http://www.laurentluce.com/posts/python-string-objects-implementation/

like image 43
seeg Avatar answered Sep 20 '22 06:09

seeg