Python 继承 和 多态


1、继承

  • 继承的概念

在面向对象程序设计中,当咱们定义一个类class的时候,能够从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。设计

语法形式:code

class new_class_name( base_class_1,base_class_2,…. ):
    pass

例如:对象

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

# Dog继承Animal,子类得到了父类的所有功能
class Dog (Animal):
     pass
class Cat(Animal):
     pass
  • 继承的好处

一、经过父类派生出子类,子类得到了父类的所有功能。子类继承父类任何属性,包括数据属性和方法属性。
二、除了继承父类的所有功能,还能够覆盖父类的功能,或者定制只属于本身的特定功能。
如上例子,Animal实现了run()方法。所以,DogCat做为其子类,自动得到了run()方法。继承

尝试运行下代码:string

>>> dog = Dog()
>>> dog.run()
animal is running ...
>>> cat = Cat()
>>> cat.run()
animal is running ...

2、多态

针对上述第2点,经过继承覆盖,能够给子类单独增长或者修改一些方法。程序设计

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

# Dog继承Animal,子类得到了父类的所有功能
class Dog (Animal):
    # 多态,子类的方法覆盖了父类的方法
     def run(self):
         print('dog is running...')     
     def eat(self):
         print('eating meat')
    
class Cat(Animal):
     def run(self):
         print('cat is running ... ')

在子类中,分别从新修改了run()方法的实现,这种能够成为“多态”。class

  • 类与数据类型

当咱们定义 了一个类,实际上也就定义了一种数据类型,与list、dict、string没有差异。例如:object

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

咱们能够经过isinstance()来判断他们的类型:数据类型

>>> isinstance(a, list) 
True 
>>> isinstance(b, Animal) 
True 
>>> isinstance(c, Animal) 
True                        # 此处c不单单是Dog类型,仍是Animal类型。
>>> isinstance(b, Dog) 
False

能够发现,c对象不单单是Dog类型,仍是Animal类型(Dog的父类)。可是反过来,Animal不是Dog类型。
即在继承关系中,若是一个实例的数据类型是某个子类,那它的数据类型也能够被看作是父类。可是,若是一个实例的数据类型是父类,不能够被看作是子类。语法

尝试以下运行:

dog = Dog()
dog.run()
cat = Cat()
cat.run()
结果就是:
dog is running...
cat is running...

在上述中,传入dog和cat都是Animal类型,因为Animal类型有run()方法,所以,只要传入的类型是Animal类或者子类,就会自动调用实际类型的run()方法,无需确切地知道它的子类型。可是具体调用的run()方法是做用在哪一个对象上(具体调用哪一个类的run()方法),由运行时该对象的确切类型决定。
Dog类对run()方法进行了重写,则dog对象调用的是自身类里的run()方法,同理cat对象。


❤ thanks for watching, keep on updating...
点个赞再走吧

相关文章
相关标签/搜索