返回顶部
首页 > 资讯 > 后端开发 > Python >课时38:类与对象:继承
  • 730
分享到

课时38:类与对象:继承

课时对象 2023-01-30 22:01:06 730人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录:  一、继承   二、调用未绑定的父类方法   三、使用super函数   四、多重继承   五、课时38课后习题及答案   现在需要扩展游戏,对鱼类进行细分,有金鱼(Goldfish)、三文鱼(Salmon)、鲤鱼(Carp),还

目录:
  一、继承

  二、调用未绑定的父类方法

  三、使用super函数

  四、多重继承

  五、课时38课后习题及答案

 

现在需要扩展游戏,对鱼类进行细分,有金鱼(Goldfish)、三文鱼(Salmon)、鲤鱼(Carp),还有鲨鱼(Shark)。那么我们来思考一个问题:能不能不要每次都从头到尾去重新定义一个新的鱼类呢?因为我们知道大多数鱼的属性和方法是相似的,如果有一种机制可以让这些相似的东西得以自动传递,那就方便快捷多了。这种机制就是今天要讲的:继承。

***********

一、继承

***********

 语法很简单:

class 类名(被继承的类):
        ...

被继承的类称为基类、父类或超类;继承者称为子类,一个子类可以继承它的父类的任何属性和方法。举个例子:

>>> class Parent:
    def hello(self):
        print("正在调用父类的方法...")

        
>>> class Child(Parent):
    pass

>>> p = Parent()
>>> p.hello()
正在调用父类的方法...
>>> c = Child()
>>> c.hello()
正在调用父类的方法...

需要注意的是:如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性:

>>> class Child(Parent):
    def hello(self):
        print("正在调用子类的方法...")

        
>>> c = Child()
>>> c.hello()
正在调用子类的方法...

好,那尝试一下刚才提到的金鱼(Goldfish)、三文鱼(Salmon)、鲤鱼(Carp),还有鲨鱼(Shark)的例子:

#p11-2.py
import random as r

class Fish:
      def __init__(self):
            self.x = r.randint(0, 10)
            self.y = r.randint(0, 10)
            
      def move(self):
            #这里主要演示类的继承机制,就不考虑检查场景边界和移动方向的问题

            #假设所有鱼都是一路向西游
            self.x -= 1
            print("我的位置是:", self.x, self.y)

class Goldfish(Fish):
      pass

class Carp(Fish):
      pass

class Salmon(Fish):
      pass

#上边几个都是食物,食物不需要有个性,所以直接继承Fish类的全部属性和方法即可
#下边定义鲨鱼类,这个是吃货,除了继承Fish类的属性和方法,还要添加一个吃的方法

class Shark(Fish):
      def __init__(self):
            self.hungry = True

      def eat(self):
            if self.hungry:
                  print("吃货的梦想就是天天有的吃^_^")
                  self.hungry = False
            else:
                  print("太撑了,吃不下了!")
>>> #先运行p11-2.py
>>> fish = Fish()
>>> #试试小鱼儿能不能动
>>> fish.move()
我的位置是: 7 0
>>> goldfish = Goldfish()
>>> goldfish.move()
我的位置是: 2 2
>>> goldfish.move()
我的位置是: 1 2
>>> goldfish.move()
我的位置是: 0 2
>>> #可见金鱼确实在一路向西
>>> #下面尝试生成鲨鱼
>>> shark = Shark()
>>> #试试这货能不能吃东西?
>>> shark.eat()
吃货的梦想就是天天有的吃^_^
>>> shark.eat()
太撑了,吃不下了!>>> shark.move()
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    shark.move()
  File "C:\Users\14158\Desktop\lalallalalal.py", line 13, in move
    self.x -= 1
AttributeError: 'Shark' object has no attribute 'x'

奇怪!同样是继承于Fish类,为什么金鱼(goldfish)可以移动,而鲨鱼(shark)一移动就报错呢?

其实这里抛出的异常说得很清楚了:Shark对象没有x属性。原因其实是这样的:在Shark类中,重写了魔法方法_ _init_ _,但新的_ _int_ _方法里边没有初始化鲨鱼的x坐标和y坐标,因此调用move方法就会出错。那么解决这个问题的方案就很明显了,应该在鲨鱼类中重写_ _int_ _方法的时候先调用基类Fish的_ _init_ _方法。

下面介绍两种可以实现的技术:

(1)调用未绑定的父类方法

(2)使用super函数

 

*******************************

二、调用未绑定的父类方法

*******************************

 看以下代码:

class Shark(Fish):
      def __init__(self):
            Fish.__init__(self)
            self.hungry = True

再运行下,发现鲨鱼可以移动了:

>>> #先运行修改后的p11-2.py
>>> shark = Shark()
>>> shark.move()
我的位置是: 6 0
>>> shark.move()
我的位置是: 5 0
>>> shark.move()
我的位置是: 4 0

这里需要注意的是这个self并不是父类Fish的实例对象,而是子类Shark的实例对象,所以这里说的未绑定是指并不需要绑定父类的实例对象,使用子类的实例对象代替即可。

python中有一个更好的方案可以代替它,就是使用super函数。

 

**********************

三、使用super函数

**********************

 super函数能够帮我们自动找到基类的方法,而且还为我们传入了self参数,这样就不需要做这些事了:

class Shark(Fish):
      def __init__(self):
            super().__init__()
            self.hungry = True

运行后会得到同样的结果。

super函数的“超级”之处在于你不需要明确给出任何基类的名字,它会自动帮你找到所有基类以及对应的方法。由于你不用给出基类的名字,这就意味着如果需要改变类继承关系,只要改变class语句里的父类即可,而不必要在大量代码中去修改所有被继承的方法。

 

****************

四、多重继承

****************

 除此之外Python还支持多继承,就是可以同时继承多个父类的属性和方法:

class 类名(父类1,父类2,父类3,...):
        ...
>>> class Base1:
    def foo1(self):
        print("我是foo1,我在Base1中...")

        
>>> class Base2:
    def foo2(self):
        print("我是foo2,我在Base2中...")

        
>>> class C(Base1,Base2):
    pass

>>> c = C()
>>> c.foo1()
我是foo1,我在Base1中...
>>> c.foo2()
我是foo2,我在Base2中...

上面就是基本的多重继承的语法。但多重继承其实很容易导致代码混乱,所以当你不确定是否真的必须使用多重继承的时候,请尽量避免使用它,因为有些时候会出现不可预见的BUG。

 

【扩展阅读】多重继承的陷阱:砖石继承(菱形继承)问题(https://fishc.com.cn/forum.PHP?mod=viewthread&tid=48759&extra=page%3D1%26filter%3Dtypeid%26typeid%3D403).

*******************************

五、课时38课后习题及答案

*******************************

 

 

--结束END--

本文标题: 课时38:类与对象:继承

本文链接: https://lsjlt.com/news/179359.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 课时38:类与对象:继承
    目录:  一、继承   二、调用未绑定的父类方法   三、使用super函数   四、多重继承   五、课时38课后习题及答案   现在需要扩展游戏,对鱼类进行细分,有金鱼(Goldfish)、三文鱼(Salmon)、鲤鱼(Carp),还...
    99+
    2023-01-30
    课时 对象
  • 课时39:类与对象:拾遗
    目录:   一、组合   二、类、类对象和实例对象   三、到底什么是绑定   四、课时39课后习题及答案   *********** 一、组合 ***********  现在要求定义一个类,叫水池,水池里要有乌龟和鱼。 在Python里...
    99+
    2023-01-30
    课时 对象
  • 课时37:类与对象:面向对象编程
    目录:   一、self是什么   二、Python的魔法方法   三、公有和私有   四、课时37课后习题及答案   ***************** 一、self是什么 ***************** 对象的方法都有一个self...
    99+
    2023-01-30
    课时 面向对象 对象
  • 课时36:类与对象:给大家介绍对象
    目录:   一、对象=属性+方法   二、课时36课后习题及答案   大家之前已经听说过封装的概念,把乱七八糟的数据扔进列表里面,这是一种封装,是数据层面的封装;把常用的代码段打包成一个函数,这也是一种封装,是语句层面的封装;本章学习的对...
    99+
    2023-01-30
    对象 给大家 课时
  • python 面向对象之类的继承
    python中什么是继承:新类不必从头编写新类从现有的类继承,就自动拥有了现有类的所有功能新类只需要编写现有类缺少的新功能继承的好处:复用已有代码自动拥有了现有类的所有功能只需要编写缺少的新功能继承的特点:子类和父类是is关系python继...
    99+
    2023-01-30
    面向对象 python
  • JavaScript 类与继承:面向对象的终级武器
    JavaScript 类:OOP 的基础 JavaScript 类是创建对象蓝图的数据结构。它们定义了对象的数据和行为,允许开发人员使用类属性和方法创建具有相似特征和功能的对象。 以下是创建 JavaScript 类的示例: class ...
    99+
    2024-02-15
    JavaScript 继承 OOP 面向对象编程 模块化 可维护 可重用
  • JavaScript 类与继承:开启面向对象编程之旅
    JavaScript 类:面向对象编程的基础 JavaScript 类是用于创建对象的蓝图,它定义了对象的属性和方法。使用 class 关键字可以创建一个类,其中 class 关键字后面跟着类名称: class Person { /...
    99+
    2024-02-15
    JavaScript 继承 面向对象编程 代码重用 扩展性
  • 课时40:类与对象:一些相关的BIF
    目录:    一、一些相关的BIF    二、、课时40课后习题及答案   **********************  一、一些相关的BIF ********************** 1、issubclass(class,clas...
    99+
    2023-01-30
    课时 对象 BIF
  • Python面向对象——继承
    #coding:utf-8 """ 术语: 1、在python3中,自定义创建的类都默认继承了python类中名为object的类 2、object类提供的方法,是双下划线开头的,是为了提供给python内部使用 3、被继承的类叫做超类,...
    99+
    2023-01-31
    面向对象 Python
  • PHP继承和多态:面向对象编程的必修课
    在面向对象编程(OOP)中,继承和多态是两个极具魅力的概念,它们使代码更加灵活、可复用,并有助于构建更复杂、更健壮的应用程序。 继承: 继承是一种代码重用机制,它允许一个类从另一个类(称为父类或基类)继承属性和方法。继承的本质是派生一个...
    99+
    2024-02-27
    PHP、面向对象编程、继承、多态、类、对象
  • JavaScript 类与继承:揭开面向对象编程的帷幕
    JavaScript 中的面向对象编程简介 面向对象编程(OOP)是一种强大的编程范例,它将代码组织成对象,这些对象包含数据(属性)和操作这些数据的方法。在 JavaScript 中,OOP 通过类来实现。 JavaScript 中的类...
    99+
    2024-02-15
    JavaScript 继承 面向对象编程
  • JavaScript 类与继承:破解面向对象编程的代码
    ...
    99+
    2024-04-02
  • python面向对象之类的继承详解
    目录一、概述 二、类的继承2.1 继承的定义2.2 构造函数的继承 2.3 子类对父类方法的重写三、类继承的事例一、概述  面向对象编程 (OOP) 语言的一个主要功能就是“继承”。...
    99+
    2024-04-02
  • Java面向对象之类的继承介绍
    目录继承的作用如果没有继承机制是怎么样的?使用继承机制后的示例?类的继承是什么?子类和父类的继承机制Java单继承Java继承的顶级父类:Object对象的类型转换对象向上转型对象向...
    99+
    2024-04-02
  • php接口继承对象类怎么实现
    在PHP中,可以通过使用extends关键字来实现接口继承对象类。下面是一个示例:php在上面的示例中,我们定义了一个名为MyCla...
    99+
    2023-10-18
    php
  • Python面向对象编程之类的继承
    目录1、对继承的理解2、类继承的构建3、Python中最基础的类4、ython类的重载4.1 属性重载4.2 方法重载5、类的多继承1、对继承的理解 继承(Inheritance) ...
    99+
    2024-04-02
  • java面向对象继承与多态介绍
    目录一.概述  二.继承2.1 继承的概述2.2 继承机制2.3 类中属性,方法的继承与覆盖2.4 super 关键字三. 多态总结一.概述 ...
    99+
    2024-04-02
  • Java接口的继承与抽象类介绍
    这篇文章主要讲解了“Java接口的继承与抽象类介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java接口的继承与抽象类介绍”吧!在实施接口中,我们利用interface语法,将inter...
    99+
    2023-06-02
  • python 面向对象之继承
    文章目录 前言继承的概念单继承多继承子类重写父类的同名方法和属性子类调用父类同名的方法和属性多层继承私有权限 前言 前面我们已经学习了 python 面向对象的类和对象,那么今天我将为大...
    99+
    2023-09-01
    python 开发语言
  • JS对象创建与继承的汇总梳理
    目录引言对象创建工厂函数构造函数构造+原型工厂+构造+原型ES6 class对象与函数小结引言 在 6 月更文中零零散散讲了 JS 的对象创建和对象继承,有工友对此还是表示疑惑,要注...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作