首页 > 编程笔记 > Python笔记 阅读:10

Python多态的用法(附带实例)

Python 中的类具有继承关系,子类可以向上转型作为父类。

例如,从 Person 派生 Student 和 Teacher,并都写了一个 whoAmI() 的方法:
class Person(object):
    def __init__(self, name):
        self.name = name

    def whoAmI(self):
        return 'I am a Person, my name is %s' % self.name

class Student(Person):
    def __init__(self, name, score):
        super(Student, self).__init__(name)
        self.score = score

    def whoAmI(self):
        return 'I am a Student, my name is %s, my score is %d' % (self.name, self.score)

class Teacher(Person):
    def __init__(self, name, course):
        super(Teacher, self).__init__(name)
        self.course = course

    def whoAmI(self):
        return 'I am a Teacher, my name is %s, I teach %s' % (self.name, self.course)
在一个函数中,如果接收一个变量 x,则无论变量 x 是 Person、Student 还是 Teacher,都可以正确打印结果,即:
def who_am_i(x):
    print(x.whoAmI())

p = Person('messi')
s = Student('xavi', 97)
t = Teacher('iniesta', 'Spanish')

who_am_i(p)
who_am_i(s)
who_am_i(t)
运行结果为:

I am a Person, my name is messi
I am a Student, my name is xavi, my score is 97
I am a Teacher, my name is iniesta, I teach Spanish

这种情况就是面向对象编程中的多态。

方法调用将作用在变量 x 的实际类型上。s 是 Student 的类型,拥有自己的 whoAmI() 方法及从 Person 继承的 whoAmI() 方法,调用 s.whoAmI() 总是先查找自身的定义,如果自身没有定义,则顺着继承链向上查找,直到在某个父类中找到。

由于 Python 是动态语言,因此传递给函数 who_am_i(x) 的参数 x 不一定是 Person 或 Person 的子类。任何数据类型的实例都可以,只要它有一个 whoAmI() 的方法即可。这是动态语言和静态语言(如 Java)的最大区别之一。动态语言调用实例方法不检查类型,只要方法存在且参数正确就可以调用。

相关文章