python面向对象之多态

多态

第一阶段:判断一个变量是否是某个类型可以用isinstance()判断

class Animal(object):
    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")

a = list() # a是list类型
b = Animal() # b是Animal类型
c = Dog() # c是Dog类型


>>> isinstance(a, list)
True
>>> isinstance(b, Animal)
True
>>> isinstance(c, Dog)
True

阶段二:Dog是Animal的子类,那么c是否也算是Animal数据类型了?答案是肯定的,那么这个现象又说明了什么问题?

>>> isinstance(c, Animal)
True

只要子类继承自父类,子类和父类的类型相同。

阶段三:写函数,用来驱赶dog和cat,然后让dog和cat跑起来,应该如何做?

# 正常的情况下:

class Animal(object):
    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 testDrive_out_dog(dog):
    print("驱赶dog")
    dog.run()
    
def Drive_out_cat(cat):
    print("驱赶cat")
    cat.run()

testDrive_out_dog(Dog())
Drive_out_cat(Cat())

第四阶段:对于上面的方法**,如果我有一万种动物需要驱赶,难道我也要写一万个驱赶函数吗?NO

class Animal(object):
    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 Drive_out_animal(animal):
    print(f"驱赶animal")
    animal.run()
    
Drive_out_animal(Dog())	
Drive_out_animal(Cat())

其实我们只需要传入对象即可,因为dog和cat都有自己的run()方法。这就是多态。对于使用者来说,自己的代码根本无需改动,只需要拥有run()方法即可。

原文地址:https://www.cnblogs.com/plf-Jack/p/11053098.html