多态

要理解什么是多态,我们首先要对数据类型再作一点说明,当我们定义一个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...

原文地址:https://www.cnblogs.com/hzcya1995/p/13349602.html