classPerson(object): def__init__(self, name, gender): self.name = name self.gender = gender defwhoAmI(self): return'I am a Person, my name is %s' % self.name
classStudent(Person): def__init__(self, name, gender, score): super(Student, self).__init__(name, gender) self.score = score defwhoAmI(self): return'I am a Student, my name is %s' % self.name
classTeacher(Person): def__init__(self, name, gender, course): super(Teacher, self).__init__(name, gender) self.course = course defwhoAmI(self): return'I am a Teacher, my name is %s' % self.name
在一个函数中,如果我们接收一个变量 x,则无论该 x 是 Person、Student还是 Teacher,都可以正确打印出结果:
1 2 3 4 5 6 7 8 9 10
defwho_am_i(x): print x.whoAmI()
p = Person('Tim', 'Male') s = Student('Bob', 'Male', 88) t = Teacher('Alice', 'Female', 'English')
who_am_i(p) who_am_i(s) who_am_i(t)
运行结果:
1 2 3
I am a Person, my name is Tim I am a Student, my name is Bob I am a Teacher, my name is Alice
这种行为称为多态。也就是说,方法调用将作用在 x 的实际类型上。s 是Student类型,它实际上拥有自己的 whoAmI() 方法以及从 Person继承的 whoAmI方法,但调用 s.whoAmI() 总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。
由于Python是动态语言,所以,传递给函数 who_am_i(x) 的参数 x 不一定是 Person 或 Person 的子类型。任何数据类型的实例都可以,只要它 有一个whoAmI() 的方法即可: