通过继承子类获得了父类的全部功能。
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...')
这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。