1. __str__
和__repr__
如果要把一个类的实例变成 str,就需要实现特殊方法__str__()
:
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def __str__(self):
return '(Person: %s, %s)' % (self.name, self.gender)
现在,在交互式命令行下用 print 试试:
>>> p = Person('Bob', 'male')
>>> print p
(Person: Bob, male)
但是,如果直接敲变量 p:
>>> p
<main.Person object at 0x10c941890>
似乎str() 不会被调用。
因为 Python 定义了__str__()
和__repr__()
两种方法,__str__()
用于显示给用户,而__repr__()
用于显示给开发人员。
有一个偷懒的定义__repr__
的方法:
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def __str__(self):
return '(Person: %s, %s)' % (self.name, self.gender)
__repr__ = __str__
2. __cmp__
对 int、str 等内置数据类型排序时,Python的 sorted()
按照默认的比较函数 cmp
排序,但是,如果对一组 Student 类的实例排序
时,就必须提供我们自己的特殊方法__cmp__()
:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def __str__(self):
return '(%s: %s)' % (self.name, self.score)
__repr__ = __str__
def __cmp__(self, s):
if self.name < s.name:
return -1
elif self.name > s.name:
return 1
else:
return 0
上述 Student 类实现了__cmp__()
方法,__cmp__
用实例自身self和传入的实例 s 进行比较,如果 self 应该排在前面,就返回 -1,如果 s 应该排在前面,就返回1,如果两者相等,返回 0。
Student类实现了按name进行排序:
>>> L = [Student('Tim', 99), Student('Bob', 88), Student('Alice', 77)]
>>> print sorted(L)
[(Alice: 77), (Bob: 88), (Tim: 99)]
注意: 如果list不仅仅包含 Student 类,则 __cmp__
可能会报错:
L = [Student('Tim', 99), Student('Bob', 88), 100, 'Hello']
print sorted(L)
请思考如何解决。
实例
请修改 Student 的 __cmp__
方法,让它按照分数从高到底排序,分数相同的按名字排序。
分析
需要先比较 score,在 score 相等的情况下,再比较 name。
参考代码:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score