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从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。

posted @ 2021-08-06 16:32  rissa  阅读(68)  评论(0)    收藏  举报

记录学习笔记,会有很多是参考重复,如有侵权,联系删除