1 __str__和__repr__
2 如果要把一个类的实例变成 str,就需要实现特殊方法__str__():
3
4 class Person(object):
5 def __init__(self, name, gender):
6 self.name = name
7 self.gender = gender
8 def __str__(self):
9 return '(Person: %s, %s)' % (self.name, self.gender)
10 现在,在交互式命令行下用 print 试试:
11
12 >>> p = Person('Bob', 'male')
13 >>> print p
14 (Person: Bob, male)
15 但是,如果直接敲变量 p:
16
17 >>> p
18 <main.Person object at 0x10c941890>
19 似乎__str__() 不会被调用。
20
21 因为 Python 定义了__str__()和__repr__()两种方法,__str__()用于显示给用户,而__repr__()用于显示给开发人员。
22
23 有一个偷懒的定义__repr__的方法:
24
25 class Person(object):
26 def __init__(self, name, gender):
27 self.name = name
28 self.gender = gender
29 def __str__(self):
30 return '(Person: %s, %s)' % (self.name, self.gender)
31 __repr__ = __str__
32 任务
33 请给Student 类定义__str__和__repr__方法,使得能打印出<Student: name, gender, score>:
34
35 class Student(Person):
36 def __init__(self, name, gender, score):
37 super(Student, self).__init__(name, gender)
38 self.score = score
39 ?不会了怎么办
40 只要为Students 类加上__str__()和__repr__()方法即可。
41
42 参考代码:
43
44 class Person(object):
45 def __init__(self, name, gender):
46 self.name = name
47 self.gender = gender
48
49 class Student(Person):
50 def __init__(self, name, gender, score):
51 super(Student, self).__init__(name, gender)
52 self.score = score
53 def __str__(self):
54 return '(Student: %s, %s, %s)' % (self.name, self.gender, self.score)
55 __repr__ = __str__
56
57 s = Student('Bob', 'male', 88)
58 print s ## 会调用__str__()函数
59
60
61
62 ######################## __call__() ################################################
63 一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法。
64
65 Python中,如果在创建class的时候写了call()方法, 那么该class实例化出实例后, 实例名()就是调用call()方法。
66
67
68 class Person(object):
69 def __init__(self, name, gender):
70 self.name = name
71 self.gender = gender
72
73 def __call__(self, friend):
74 print 'My name is %s...' % self.name
75 print 'My friend is %s...' % friend
76
77
78 p=Person('huang',88) ## 此步执行时,即类实例化了,构造函数会自动执行
79 p('xiaren') ## 只有此步,才会自动调用__call__内置方法