多态是什麼?
用一句話來概括下,多态就是同一操作(方法)作用于不同的對象時,可以有不同的解釋,産生不同的執行結果。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017/12/26 0026 15:18
# @Author : ming
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def who(self):
return 'I am a Person, my name is %s' % self.name
class Student(Person):
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender)
self.score = score
def who(self):
return 'I am a Student, my name is %s' % self.name
class Teacher(Person):
def __init__(self, name, gender, course):
super(Teacher, self).__init__(name, gender)
self.course = course
def who(self):
return 'I am a Teacher, my name is %s' % self.name
def run(x):
print(x.who())
a = Person("keke", "Male")
b = Student("Coke", "Male", 98)
c = Teacher("Jone", "Female", "Chinese")
run(a)
run(b)
run(c)
View Code
在一個函數中,如果我們接收一個變量 x,則無論該 x 是 Person、Student還是 Teacher,都可以正确列印出結果:

I am a Person, my name is keke
I am a Student, my name is Coke
I am a Teacher, my name is Jone
運作結果
這種行為稱為多态。也就是說,方法調用将作用在 x 的實際類型上。s 是Student類型,它實際上擁有自己的 who()方法以及從 Person繼承的 who方法,但調用 s.who()總是先查找它自身的定義,如果沒有定義,則順着繼承鍊向上查找,直到在某個父類中找到為止。
由于Python是動态語言,是以,傳遞給函數 who(x)的參數 x 不一定是 Person 或 Person 的子類型。任何資料類型的執行個體都可以,隻要它有一個who()的方法即可。
在繼承關系中,如果一個執行個體的資料類型是某個子類,那它的資料類型也可以被看做是父類。但是,反過來就不行,如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017/12/26 0026 15:18
# @Author : ming
class Animal:
def run(self):
print('Animal is running...')
class Dog(Animal):
def run(self):
print('Dog is running...')
class Cat(Animal):
def run(self):
print('Cat is running...')
def run_twice(animal):
animal.run()
animal.run()
a = Animal()
d = Dog()
c = Cat()
print('a is Animal?', isinstance(a, Animal))
print('a is Dog?', isinstance(a, Dog))
print('a is Cat?', isinstance(a, Cat))
print('d is Animal?', isinstance(d, Animal))
print('d is Dog?', isinstance(d, Dog))
print('d is Cat?', isinstance(d, Cat))
run_twice(c)

a is Animal? True
a is Dog? False
a is Cat? False
d is Animal? True
d is Dog? True
d is Cat? False
Cat is running...
Cat is running...
作者:楊永明
出處:https://www.cnblogs.com/ming5218/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接。