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)
精彩评论