美文网首页
python 继承和多态

python 继承和多态

作者: Ji_uu | 来源:发表于2017-09-18 18:59 被阅读0次

    来自廖雪峰
    class(类)可以被继承,新的class称为子类(Subclass),被继承的class是基类、父类或超类(Base class, Super class)
    例如,编一个Animal的class,有一个run()方法:

    class Animal(object):
      def run(self):
        print("Animal is running...")
    

    我们编写Dog和Cat类,可以从Animal类继承:

    class Dog(Animal):
      paaa
    
    class Cat(Animal):
      pass
    

    Dog和Cat是Animal的子类,Animal是Dog和Cat的父类。
    继承的最大好处是子类继承了父类的全部功能。Dog和Cat自动拥有了Animal的run()方法:

    dog = Dog()
    dog.run()
    
    cat = Cat()
    cat.run()
    

    运行结果:

    Animal is running
    Animal is running 
    

    可以对子类增加一些方法,比如Dog类:

    class Dog(Animal):
      def run(self):
        print("Dog is running..")
    
      def eat(self):
        print("Eating meat...")
    

    继承的第二好处是,对代码进行改进:

    class Dog(Animal):
      def run(self):
        print("Dog is running...")
    
      class Cat(Animal):
        def run(self):
          print("Cat is running...")
    

    再次运行的结果:

    Dog is running...
    Cat is running...
    

    当子类和父类都存在相同的run()方法时,我们说,子类的run()覆盖了父类的run(),在代码运行的时候,总是会调用子类的run()。这样,我们就获得了继承的另一个好处:多态。

    要理解什么是多态,我们首先要对数据类型再作一点说明。当我们定义一个class的时候,我们实际上就定义了一种数据类型。我们定义的数据类型和Python自带的数据类型,比如str、list、dict没什么两样:

    a = list()              #  a是list类型
    b = Animal()            #  b是Animal类型
    c = Dog()                #  c是Dog类型
    

    判断一个变量是否是某个类型,用 isinstance() :

    >>>isinstance(a, list)
    True
    >>>isinstance(b, Animal)
    True
    >>>isinstance(c, Dog)
    True
    

    a,b,c对应着list,Animal,Dog类型,接着看

    >>>ininstance(c, Animal)
    True
    

    由此看出c不仅仅是Dog, c还是Animal !!
    所以在继承的关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。反过来不行

    >>>b = Animal()
    >>>isinstance(b, Dog)
    False
    

    要理解多态的好处,我们还需要编写一个函数,这个函数接收一个Animal类型的变量:

    def run_twice(animal):
      animal.run()
      animal.run()
    

    当我们传入Animal的实例时,run_twice()就打印出:

    >>>run_twice(Animal())
    Animal is running...
    Animal is running...
    

    当我们传入Dog的实例时,run_twice() 就打印出:

    >>>run_twice(Dog())
    Dog is running...
    Dog is running...
    

    看上去没有 什么意思,如果我们再定义一个Tortoise (乌龟)类型,也从Animal派生:

    class Tortoise(Animal):
      def run(self):
        print("Tortoise is running slowly...")
    

    当我们调用run_twice时,传入

    相关文章

      网友评论

          本文标题:python 继承和多态

          本文链接:https://www.haomeiwen.com/subject/wagbsxtx.html