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__内置方法