22、python面向对象编程--继承和多态

通过继承子类获得了父类的全部功能。

class Animal():
    def run(self):
        print('Animal is running...')

'''Cat 继承 Animal类'''
class Cat(Animal):
    pass

c = Cat()
'''Cat继承了Animal的run方法'''
c.run()

输出结果:
Animal is running...

多态

class Animal():
    def run(self):
        print('Animal is running...')

class Dog(Animal):
    '''子类和父类都存在相同的run()方法时,
    子类的run()覆盖了父类的run(),代码运行时,总是会调用子类的run()'''
    def run(self):
        print('Dog is running...')

class Cat(Animal):
    def run(self):
        print('Cat is running...')

#多态
'''当需要接受不同的子类型时,可以直接接受父类型,按照Animal类型进行操作即可
由于Animal类型有run()方法,因此,传入的任意类型,只要是Animal类或者子类,
就会自动调用实际类型的run()方法'''
def run_twice(animal):
    animal.run()
    animal.run()
#
a = Animal()
d = Dog()
c = Cat()

run_twice(a)
run_twice(d)
run_twice(c)


输出:
Animal is running...
Animal is running...
Dog is running...
Dog is running...
Cat is running...
Cat is running...

静态语言 vs 动态语言

对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。

对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了:

class Timer(object):
    def run(self):
        print('Start...')

这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。

发布了70 篇原创文章 · 获赞 29 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/LOVEYSUXIN/article/details/103382899