资讯专栏INFORMATION COLUMN

Python 继承 和 多态

dance / 250人阅读

摘要:子类继承父类任何属性,包括数据属性和方法属性。继承,子类获得了父类的全部功能多态,子类的方法覆盖了父类的方法在子类中,分别重新修改了方法的实现,这种可以成为多态。


一、继承

继承的概念

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

语法形式:

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

继承的好处

1、通过父类派生出子类,子类获得了父类的全部功能。子类继承父类任何属性,包括数据属性和方法属性。
2、除了继承父类的全部功能,还可以覆盖父类的功能,或者定制只属于自己的特定功能。
如上例子,Animal实现了run()方法。因此,DogCat作为其子类,自动获得了run()方法。

尝试运行下代码:

>>> dog = Dog()
>>> dog.run()
animal is running ...
>>> cat = Cat()
>>> cat.run()
animal is running ...
二、多态

针对上述第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()方法的实现,这种可以成为“多态”。

类与数据类型

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

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...
点个赞再走吧

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44982.html

相关文章

  • Python面向对象的三大特性封装、继承多态

      小编写这篇文章的主要目的,主要是来给大家介绍关于Python的一些事情,主要还是涉及到面对面对象编程的一些实例,其中,主要涉及到的内容涵盖封装、继承、多态等多种形式,就具体的形式,下面就给大家详细解答下。  Python是一门面向对象的语言。面向对象都有三大特性:封装、继承、多态。  下面分别来说说这三大特性:  1、封装  隐藏对象的属性和实现细节,仅对外提供公共访问方式。在python中用...

    89542767 评论0 收藏0
  • python多态的个人理解

    摘要:在面向对象方法中一般是这样表述多态性向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为即方法。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。 多态就是:定义一个类class X(animal) 中间继承animal 实现的方法是.run() 方法继承animal的实例是cat dog 他们默认都有r...

    StonePanda 评论0 收藏0
  • python学习笔记-继承多态

    摘要:编程中的继承和多态其实跟生物学中的遗传非常类似。中的类继承了类中的所有方法和属性,那么就有了所有的属性和方法。当然也可以在的基础上添加属性和方法,也可以修改继承自的属性和方法覆写,。 编程中的继承和多态其实跟生物学中的遗传非常类似。例如儿子与父亲相比较,有很多相同的地方,那么这就是遗传;但是父子间也有很多不一样的地方,那么这就是变异,也就是多态。 python中的Student类继承了...

    leiyi 评论0 收藏0
  • 浅谈JavaScript的面向对象它的封装、继承多态

    摘要:会造成内存浪费的问题构造函数继承声明父类声明子类生成实例组合式继承组合式继承是汲取了两者的优点,既避免了内存浪费,又使得每个实例化的子类互不影响。 写在前面 既然是浅谈,就不会从原理上深度分析,只是帮助我们更好地理解... 面向对象与面向过程 面向对象和面向过程是两种不同的编程思想,刚开始接触编程的时候,我们大都是从面向过程起步的,毕竟像我一样,大家接触的第一门计算机语言大概率都是C语...

    MAX_zuo 评论0 收藏0
  • 浅析 Python 的类、继承多态

    摘要:类的定义假如要定义一个类,表示二维的坐标点最最基本的就是方法,相当于的构造函数。严格来讲,并不支持多态。静态类型的缺失,让很难实现那样严格的多态检查机制。有时候,需要在子类中调用父类的方法。 类的定义 假如要定义一个类 Point,表示二维的坐标点: # point.py class Point: def __init__(self, x=0, y=0): se...

    shadajin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<