要理解什么是多态,我们首先要对数据类型再作一点说明,当我们定义一个class的时候,
我们实际上就定义了一种数据类型,我们定义的数据类型和Python自带的数据类型,比如str,list,dict没什么两样:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print '%s: %s' % (self.name, self.score -2)
from mycompany.web.Student import *
c = Student('a',88)
print c.name
print isinstance(c, Student)
print c.print_score()
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/a1.py
a
True
a: 86
None
a = list() # a是list类型
b = Animal() # b是Animal类型
c = Dog() # c是Dog类型
判断一个变量是否是某个类型可以用isinstance()判断:
>>> isinstance(a, list)
True
>>> isinstance(b, Animal)
True
>>> isinstance(c, Dog)
Tru
from mycompany.web.Dog import *
c = Dog()
c.run()
print isinstance(c, Dog)
print isinstance(c, Animal)
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/a1.py
yy
Animal is running...
True
True
from mycompany.web.Dog import *
b = Animal()
print b.run()
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/a1.py
yy
Animal isxx running...
None
from mycompany.web.Dog import *
def run_twice(animal):
animal.run()
print '----------------'
run_twice(Animal())
run_twice(Dog())
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/a1.py
----------------
Animal isxx running...
Dog isxx running...
Process finished with exit code 0
看上去没啥意思,但是仔细想想,现在,如果我们再定义一个Tortoise类型,也从Animal派生:
class Tortoise(Animal):
def run(self):
print 'Tortoise is running slowly...'
from mycompany.web.Tortoise import *
def run_twice(animal):
animal.run()
print '----------------'
run_twice(Animal())
run_twice(Tortoise())
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/a1.py
----------------
Animal isxx running...
Tortoise is running slowly...
Process finished with exit code 0
你会发现,新增一个Animal的子类,不必对run_twice()做任何修改,
实际上,任何依赖Animal 作为的函数的函数或者方法都可以不加修改地正常运行,原因在于多态
from mycompany.web.Tortoise import *
def run_twice(animal):
animal.run()
print '----------------'
run_twice(Animal())
run_twice(Tortoise())
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/a1.py
xxxx
----------------
Animal isxx running...
Animal isxx running...