Python学习之路(面向对象之继承和多态)

面向对象之继承和多态

继承 子类继承父类所有功能

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!

你可能感兴趣的:(Python学习之路(面向对象之继承和多态))