2010-07-17 5 views
5

Я новичок в Python. У меня есть эта небольшая проблема. Я хочу напечатать список объектов, но все его распечатки - это какое-то странное внутреннее представление объекта. Я даже определил метод __str__, но все же я получаю этот странный вывод. Что мне здесь не хватает?Печать списка объектов

class person(object): 
    def __init__(self, name, age): 
    self.name = name 
    self.age = age 

    def __str__(self): 
    return self.name + "(" + str(self.age) + ")" 

def partition(coll, pred): 
    left = [] 
    right = [] 
    for c in coll: 
    if pred(c): 
     left.append(c) 
    else: 
     right.append(c) 
    return left, right 


people = [ 
    person("Cheryl", 20), 
    person("Shemoor", 14), 
    person("Kimbala", 25), 
    person("Sakharam", 8) 
] 

young_fellas, old_fellas = partition(people, lambda p : p.age < 18) 
print(young_fellas) 
print(old_fellas) 

Пожалуйста, обратите внимание, что я знаю, что могу использовать либо for петлю или map функцию здесь. Я ищу что-то более короткое и более идиоматическое. Благодарю.

EDIT:

еще вопрос один: Является ли выше код шахты вещий?

ответ

7

Если вы явно не конвертируете в str, это __repr__ method, который используется для рендеринга ваших объектов.

Для получения более подробной информации см. Difference between __str__ and __repr__ in Python.

+0

Спасибо! Хотя вам все равно придется ждать 8 минут для зеленого печенья. :-) –

0

попытка перекрывая магнезии

def __repr__(self): 
     return self.name + "(" + str(self.age) + ")" 

Edit: Лучший способ, спасибо Павлу.

def __repr__(self): 
    return "%s(%d)" % (self.name, self.age) 
+1

Строчная интерполяция ''% s (% d) "% (self.name, self.age)' или ''. .join (list_of_string_bits)' лучшие стили для обучения, чем добавление маленьких бит строк, +». – PaulMcG

+0

и @Paul: Спасибо за предложение :-) –

+1

@Paul McGuire: в этом конкретном случае не очень, так что не троллите его :) –

1

Вы можете сделать:

print(map(str,young_fellas)) 
+1

Вы должны полностью прочитать вопрос, который вам известен. –

+0

О питонической части, есть раздел, посвященный документам. Вы можете использовать функцию repr (lib), чтобы создать собственное представление отладки. В этом случае человек («имя», 1) является лучшим представлением, чем человек (имя, 1), потому что он должен выглядеть как действительное выражение Python, которое может быть использовано для воссоздания объекта. http://docs.python.org/reference/datamodel.html#object.__repr__ http://www.python.org/dev/peps/pep-0008/ – SiggyF

+0

Благодарим за предложение :-) –

2

Ваш сделал этот объект:

person("Cheryl", 20) 

Это означает, что магнезии должно быть таким же, после создания:

def __repr__(self): 
return 'person(%r,%r)' % (self.name,self.age) 

Выход становится:

[person('Shemoor',14), person('Sakharam',8)] 
[person('Cheryl',20), person('Kimbala',25)] 
+0

Спасибо за предложение :-) –

+1

Добро пожаловать. Хорошая функция, которую вы написали, этот раздел. Я сам фанат струнных разделов, и я его выкопаю. –

+0

++: Поставляется с бонусом, что вывод может быть напрямую передан обратно в python (что идея repr() в любом случае) –

Смежные вопросы