This is something I don't really get. I am trying to use __repr__
to create a new object from its output.
I have a class, OrderedSet, which contains a list and methods to organize it. The str method of this class is
def __str__(self):
s = "Set contains: "
for elem in self.list: s += (" '" + elem + "'")
return s
Now I am supposed to use __repr__
in a way to instanciate a new object from it.
Like Orderedset second = repr(first)
Can I just do it like this?
def __repr__(self):
return self.list.__str__()
No. __repr__()
has to return a string or a lot of code would break.
Try this approach: __repr__()
should return valid Python code. That would allow you to
second = eval(repr(first))
That said, the whole idea looks dubious. It feels like you try to come up with a clever way to serialize or clone objects.
Use pickling for serialization or maybe the json
module. To clone, use a copy constructor.
The idea behind "using __repr__
to create new objects" is that the output of __repr__
can be valid python code, which, when interpreted with eval
, creates (a copy of) the original object. For example, repr("foo")
return "foo"
(including the "
), or repr([1,2,3])
returns [1,2,3]
.
In your example you probably need something like this:
def __repr__(self):
return "OrderedSet(%r)" % self.list
as well as a corresponding constructor:
def __init__(self, elements):
self.list = elements
This way, repr(OrderedSet([1,2,3]))
returns the string OrderedSet([1,2,3])
, which, when eval
uated, will invoke the contructor and create a new instance of the class.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With