Python学习之继承和多态
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类,而被继承的class称为基类、父类或超类。
实例:
定义一个Animal类,具有sleep行为。
class Animal(object): def __init__(self): pass def sleep(self): print("animal is sleeping")
定义一个Cat类和Dog类,分别继承Animal类,Cat和Dog具有特定的行为
class Cat(Animal): def __init__(self): pass def eat(self): print("cat eat fish")
class Dog(Animal): def __init__(self): pass def eat(self): print("dog eat meet")
Cat和Dog继承了Animal的sleep行为,所以Cat和Dog的实例变量也可以调用Animal的sleep方法。
animal = Animal() animal.sleep() cat = Cat() cat.sleep() cat.eat() dog = Dog() dog.sleep() dog.eat()

那么对于sleep行为,Cat和Dog可能具有不同的表现形式,我们也可以在子类中重写一个sleep方法。
class Animal(object): def __init__(self): pass def sleep(self): print("animal is sleeping") class Cat(Animal): def __init__(self): pass def eat(self): print("cat eat fish") def sleep(self): print("cat is sleeping") class Dog(Animal): def __init__(self): pass def eat(self): print("dog eat meet") def sleep(self): print("dog is sleeping") animal = Animal() animal.sleep() cat = Cat() cat.sleep() cat.eat() dog = Dog() dog.sleep() dog.eat()

当父类和子类拥有相同的方法时,运行代码,调用的总是子类的方法。
这就衍生出“多态”
那怎么体现多态的好处,下面定义一个函数,接收Animal类型的变量
def sleep_tmp(animal): animal.sleep()
当我们传入Animal实例,Cat实例,Dog实例时
sleep_tmp(Animal())
sleep_tmp(Cat())
sleep_tmp(Dog())

以上结果可以看出不必对sleep_tmp()做任何修改,实际上,任何依赖Animal作为参数的函数或者方法都可以不加修改地正常运行,原因就在于多态。
多态的好处就是,当我们需要传入Cat、Dog....时,我们只需要接收Animal类型就可以了,因为Cat,Dog……都是Animal类型,然后,按照Animal类型进行操作即可。由于Animal类型有sleep_tmp()方法,因此,传入的任意类型,只要是Animal类或者子类,就会自动调用实际类型的sleep_tmp()方法,这就是多态的意思。
对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用sleep()方法。
对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个sleep()方法就可以了。
多重继承
通过多重继承,一个子类就可以同时获得多个父类的所有功能。
class DerivedClassName(Base1, Base2, Base3): <statement-1> . . . <statement-N>
需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。
记录学习笔记,有其他参考,如有侵权,联系删除
本文来自博客园,作者:rissa,转载请注明原文链接:https://www.cnblogs.com/rissa/p/15102623.html

浙公网安备 33010602011771号