简体   繁体   中英

Printing an object python class

I wrote the following program:

def split_and_add(invoer):                              
    rij = invoer.split('=')
    rows = []
    for line in rij:
        rows.append(process_row(line))
    return rows

def process_row(line):                                  
    temp_coordinate_row = CoordinatRow()
    rij = line.split()
    for coordinate in rij:
        coor = process_coordinate(coordinate)
        temp_coordinate_row.add_coordinaterow(coor)
    return temp_coordinate_row

def process_coordinate(coordinate):
   cords = coordinate.split(',')
   return Coordinate(int(cords[0]),int(cords[1]))

bestand = file_input()
rows = split_and_add(bestand)
for row in range(0,len(rows)-1):
    rij = rows[row].weave(rows[row+1])
    print rij

With this class:

class CoordinatRow(object):

def __init__(self):
    self.coordinaterow = []

def add_coordinaterow(self, coordinate):
    self.coordinaterow.append(coordinate)

def weave(self,other):
    lijst = []
    for i in range(len(self.coordinaterow)):
        lijst.append(self.coordinaterow[i])
        try:
            lijst.append(other.coordinaterow[i])
        except IndexError:
            pass 
    self.coordinaterow = lijst
    return self.coordinaterow

However there is an error in

for row in range(0,len(rows)-1):
    rij = rows[row].weave(rows[row+1])
    print rij

The outcome of the print statement is as follows:

[<Coordinates.Coordinate object at 0x021F5630>, <Coordinates.Coordinate object at 0x021F56D0>]

It seems as if the program doesn't acces the actual object and printing it. What am i doing wrong here ?

This isn't an error. This is exactly what it means for Python to "access the actual object and print it". This is what the default string representation for a class looks like.

If you want to customize the string representation of your class, you do that by defining a __repr__ method. The typical way to do it is to write a method that returns something that looks like a constructor call for your class.

Since you haven't shown us the definition of Coordinate , I'll make some assumptions here:

class Coordinate(object):
    def __init__(self, x, y):
        self.x, self.y = x, y
    # your other existing methods
    def __repr__(self):
        return '{}({}, {})'.format(type(self).__name__, self.x, self.y)

If you don't define this yourself, you end up inheriting __repr__ from object , which looks something like:

return '<{} object at {:#010x}>'.format(type(self).__qualname__, id(self))

Sometimes you also want a more human-readable version of your objects. In that case, you also want to define a __str__ method:

    def __str__(self):
        return '<{}, {}>'.format(self.x, self.y)

Now:

>>> c = Coordinate(1, 2)
>>> c
Coordinate(1, 2)
>>> print(c)
<1, 2>

But notice that the __str__ of a list calls __repr__ on all of its members:

>>> cs = [c]
>>> print(cs)
[Coordinate(1, 2)]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM