面向对象之继承和多态
继承 子类继承父类所有功能
class Animal(object):
def run(self):
print('animal is running...')
# 创建Animal实例
animal = Animal()
animal.run()
# Dog类
class Dog(Animal):
pass
# 创建Dog 实例
dog = Dog()
# 调用Dog类继承来自于Animal类的run方法
dog.run()
现在我有這样一个需求 就是 不同子类继承父类调用run(),输出不同的信息,那么我们就需要在子类里边重新定义该方法来覆盖父类中的方法,這叫做多态
# Cat类 继承 Animal
class Cat(Animal):
def run(self):
print('cat is running...')
cat = Cat()
cat.run()
class Monkey(Animal):
def run(self):
print('Monkey is running...')
monkey = Monkey()
monkey.run()
# 现在输出了不同信息,但是每次都要写這么多,感觉多态也挺麻烦的,那我们再优化下:
print('-------------------------------------')
def _run(animal):
animal.run()
animal.run()
_run(Dog())
_run(Cat())
_run(Monkey())
# 這样就体现出多态的好处了
# 我们也可以还派生出一些类来, 比如:
class Tortoise(Animal):
def run(self):
print('Tortoise is running slowly...')
_run(Tortoise())
静态语言Java和动态语言Python的区别:
对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法
对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了:
这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。 证明:
print('--------------------------------------')
class Rabbit(object):
def run(self):
print('Rabbit is running...')
_run(Rabbit()) # Rabbit is running...
小结
继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。
动态语言的鸭子类型特点决定了继承不像静态语言那样是必须的。
关注一波!喜欢一波!本人是前端菜鸟,正在做自己的个人博客邓鹏的博客,欢迎来交流学习, 使用的技术 vue + koa2 + mysql + php + nginx!