开发者

Printing a list of objects [duplicate]

开发者 https://www.devze.com 2023-01-07 13:02 出处:网络
This question already has answers here: 开发者_C百科 What is the difference between __str__ and __repr__?
This question already has answers here: 开发者_C百科 What is the difference between __str__ and __repr__? (28 answers) Closed 3 months ago.

I am a Python newbie. I have this small problem. I want to print a list of objects but all it prints is some weird internal representation of object. I have even defined __str__ method but still I am getting this weird output. What am I missing here?

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)

Please note that I know I can use either a for loop or a map function here. I am looking for something shorter and more idiomatic. Thanks.

EDIT:

One more question: Is the above code of mine Pythonic?


Unless you're explicitly converting to a str, it's the __repr__ method that's used to render your objects.

See Difference between __str__ and __repr__ in Python for more details.


Your made this object:

person("Cheryl", 20)

This means repr should be same after creation:

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

Output becomes:

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


You could do:

print(map(str,young_fellas))


try overriding repr

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

Edit: Better way, Thanks to Paul.

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

精彩评论

暂无评论...
验证码 换一张
取 消