[Python] 类的继承

这篇具有很好参考价值的文章主要介绍了[Python] 类的继承。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

4.2 类的继承

在编程中,类的好处我们知道了,通过类我们可以源源不断的实例化出对象,这些对象用有相同的属性和方法,大大提高了程序代码的复用性。
在某些情况下,如果想要创建一个新的类,这个类除了要有旧类的所有属性和方法,还有一些其他的属性和方法,那么重新再去定义它显示是不明智的,这个时候可以通过继承来实现。
继承是指一种代码组织方式,它允许同一个类中的成员共享它们的方法和数据结构。在编程中,继承通常是指使用同一个类的成员来创建新的类,而不是创建一个新的类。这是因为继承可以使代码更易于编写和维护,并且可以简化代码组织方式。
继承的优点:

  1. 增强代码的可扩展性:通过使用继承,可以创建多种不同类型的类,这些类可以被扩展到不同的应用场景。
  2. 提高代码的可维护性:通过使用继承,可以将相同类型的对象划分为多个小类,从而提高代码的可维护性。
    举个例子:现在创建了一个动物类:Animal,这个动物类具有两个方法,分别是,那么在程序中可以如此定义:
class Animal:
    def eat(self):
        print('我饿了')

    def sleep(self):
        print('我困了')
animal = Animal()
animal.eat()
animal.sleep()

我饿了
我困了

一般动物都具有这2个方法,这个Animal作为动物类的模板,具有动物最基本的方法。这个时候如果还要创建新的类,比如哺乳动物类、鸟类,那么就可以通过继承动物类来创建:

class Mammal(Animal):
    def walk(self):
        print('我会走')


class Bird(Animal):
    def fly(self):
        print('我会飞')


mammal = Mammal()
bird = Bird()
mammal.walk()
mammal.sleep()
bird.fly()
bird.eat()

我会走
我困了
我会飞
我饿了

我们看到,哺乳动物类和鸟类都继承了动物类的eatsleep方法,而他们各自又新建了新方法,分别是walkfly
在上面的例子中,Animal类Mammal类Bird类继承,则称Animal类Mammal类Bird类父类基类超类。而Mammal类Bird类Animal类子类
注意,子类是无法继承父类的私有属性和私有方法的:

from icecream import ic

class Animal:
    def __init__(self):
        self.a = 'A'
        self.__b = 'B'

    def __eat(self):
        ic('我饿了')

    def sleep(self):
        ic('我困了')

class Mammal(Animal):
    ...

mammal = Mammal()
ic(mammal.a)
mammal.sleep()
try:
    ic(mammal.__b)
except AttributeError as err:
    ic(err)
try:
    mammal.__eat()
except AttributeError as err:
    ic(err)

14:28:56|> mammal.a: ‘A’
14:28:57|> ‘我困了’
14:28:57|> err: AttributeError(“‘Mammal’ object has no attribute ‘__b’”)
14:28:57|> err: AttributeError(“‘Mammal’ object has no attribute ‘__eat’”)

4.2.1 __init__方法

在类的定义中,默认有一些以__开头和结尾的特殊方法,这些方法一般是用来处理一些特别的事情,这类方法通常称为魔术方法或魔法方法。
__init__方法就是众多魔法方法中一个非常重要的方法。在类的初始化成对象时会调用这个方法,一般是用来定义一些类的属性,运行一些需要在类初始化时就需要运行的自定义方法。

from icecream import ic


class Animal:
    def __init__(self, leg=4):
        self.leg = leg


a = Animal()
ic(a.leg)
b = Animal(3)
ic(b.leg)

14:49:39|> a.leg: 4
14:49:39|> b.leg: 3

在上面代码中,因为大部分动物都是4条腿,于是直接将Animal类的leg设置为4,这样在初始化后,a.leg输出的就是默认4。而后又用Animal类初始化了一个对象b,只不过这次传入的leg是3,那么在初始化是调用__init__方法后,输出b.leg就是3了。

4.2.2 super方法

通常子类可以直接调用父类中的方法,如果子类和父类同时都有__init__方法需要定义一些初始化的属性,那么在子类中直接调用__init__方法传入参数显然是不行的。

from icecream import ic


class Animal:
    def __init__(self, leg=4):
        self.leg = leg
        self.type = '双足动物' if self.leg == 2 else '非双足动物'


class Mammal(Animal):
    def __init__(self, leg):
        self.leg = leg


a = Animal()
ic(a.leg)
ic(a.type)
m = Mammal(leg=2)
ic(m.leg)
ic(m.type)

15:11:48|> a.leg: 4
15:11:48|> a.type: ‘非双足动物’
15:11:48|> m.leg: 2
Traceback (most recent call last):
File “E:\t3.py”, line 21, in
ic(m.type)
AttributeError: ‘Mammal’ object has no attribute ‘type’

我们看到,虽然Mammal类继承了Animal类,但是无法调用Animal类的self.type属性。这是因为初始化后仅运行了Mammal类中的__init__方法而未运行Animal类中的__init__方法导致的。
要想达到传入参数同时被子类和父类初始化引入,则只需要稍微修改一下代码,在子类初始化方法__init__中调用父类的__init__并传入相应的参数即可:

from icecream import ic


class Animal:
    def __init__(self, leg=4):
        self.leg = leg
        self.type = '双足动物' if self.leg == 2 else '非双足动物'


class Mammal(Animal):
    def __init__(self, leg):
        super().__init__(leg)


a = Animal()
ic(a.leg)
ic(a.type)
m = Mammal(leg=2)
ic(m.leg)
ic(m.type)

15:16:38|> a.leg: 4
15:16:39|> a.type: ‘非双足动物’
15:16:39|> m.leg: 2
15:16:39|> m.type: ‘双足动物’

4.2.3 issubclass (x, A_tuple)、isinstance(x, A_tuple)方法

这2个方法返回x是派生自另一个类还是同一个类。A_tuple可以是一个类也可以是包含多个类的tuple。如果是tuple,则:
issubclass(x, (A, B, …))等价于:isinstance(x, A) or isinstance(x, B)…
isinstance(x, (A, B, …))等价于:isinstance(x, A) or isinstance(x, B)…
这2个方法区别在于第一个参数x,对于issubclass方法,第一个参数x必须是类,而isinstance则必须是对象。

from icecream import ic


class Animal:
    ...


class Mammal(Animal):
    ...


class Bird:
    ...


class Person(Mammal):
    ...


a = Animal()
m = Mammal()
b = Bird()
p = Person()
ic(issubclass(m.__class__, a.__class__))
ic(issubclass(m.__class__, b.__class__))
ic(isinstance(p.__class__, a.__class__))
ic(isinstance(p, p.__class__))

15:36:24|> issubclass(m.class, a.class): True
15:36:24|> issubclass(m.class, b.class): False
15:36:24|> isinstance(p.class, a.class): False
15:36:24|> isinstance(p, p.class): True文章来源地址https://www.toymoban.com/news/detail-551352.html

到了这里,关于[Python] 类的继承的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python入门基础(14)--类的属性、成员方法、静态方法以及继承、重载

    上一篇提到过类的属性,但没有详细介绍,本篇详细介绍一下类的属性 一 、类的属性 方法是用来操作数据的,而属性则是建模必不的内容,而且操作的数据,大多数是属性,比如游戏中的某个boss类,它的生命值就是属性(不同级别的boss,有不同的生命值),被攻击方法(不

    2024年02月08日
    浏览(39)
  • Python 中多态性的示例和类的继承多态性

    单词 \\\"多态\\\" 意味着 \\\"多种形式\\\",在编程中,它指的是具有相同名称的方法/函数/操作符,可以在许多不同的对象或类上执行。 一个示例是 Python 中的 len() 函数,它可以用于不同的对象。 对于字符串,len() 返回字符的数量: 示例 对于元组,len() 返回元组中项的数量: 示例 对

    2024年02月08日
    浏览(32)
  • 【Python】【进阶篇】30、Django模板继承精讲

    在本节我们讲述模板语言中最后一个知识点,也是最重要的,那就是模板继承。模板继承和 Python 语言中类的继承含义是一样的,在 Django 中模板只是一个文本文件,如 HTML,XML,CSV等文件格式。那模板继承到底是是什么呢?如何在 Django 中使用它呢?让我们一起一探究竟。 模

    2024年02月04日
    浏览(45)
  • 【知识点】python中类的相互调用

    在 Python 中,类可以相互调用。这意味着一个类可以访问另一个类的方法或属性。下面是几个例子: 在同一个文件内,不同类的相互调用例子如下: 代码 在上面的代码中, Dealership 类调用了 Car 类。它通过创建一个 Car 对象来添加汽车,并通过循环遍历汽车列表来显示汽车的

    2023年04月10日
    浏览(36)
  • Python进阶知识(一)

    最简单的模块化方式,你可以把函数、类、常量拆分到不同的文件,把它们放在同一个文 件夹,然后使用 from your_file import function_name, class_name 的方式调 用。之后,这些函数和类就可以在文件内直接使用了。 看看上面的示例代码,get_sum() 函数定义在 utils.py,Encoder 和 Decoder

    2024年02月10日
    浏览(33)
  • Python进阶知识(三)

    在Python中,迭代器(Iterator)是一种用于遍历集合元素的对象。它是一个实现了迭代器协议(Iterator Protocol)的对象,该协议包含两个方法: __iter__ 和 __next__ 。 __iter__ 方法:返回迭代器对象自身。它在迭代开始之前被调用,用于初始化迭代器的状态。 __next__ 方法:返回迭代

    2024年02月10日
    浏览(39)
  • Python进阶知识(二)

    Python装饰器是一种用于修改函数或类的行为的特殊语法构造。装饰器允许在不修改原始代码的情况下,通过将函数或类包装在另一个函数中来添加额外的功能。 装饰器通常用于以下场景: 函数的日志记录:装饰器可以用来记录函数的调用信息,如函数名称、参数和返回值等

    2024年02月10日
    浏览(35)
  • Python进阶知识(四)

    在Python中, concurrent.futures 模块提供了一种简单而强大的并发编程方式,称为\\\"Futures\\\"。它基于线程池( ThreadPoolExecutor )和进程池( ProcessPoolExecutor )的概念,使并发任务的管理和执行更加方便。 使用 concurrent.futures 模块,你可以将任务提交给执行器(Executor),然后通过 Fu

    2024年02月11日
    浏览(34)
  • 学习C++:C++进阶(六)如何在C++代码中调用python类,实例化python中类的对象,如何将conda中的深度学习环境导入C++项目中

    目录 1.应用场景 2.场景:利用maskrcnn深度学习网络实现语义分割 3.CMake配置python解释器

    2023年04月22日
    浏览(42)
  • Python小知识 - Python爬虫进阶:如何克服反爬虫技术

    Python爬虫进阶:如何克服反爬虫技术 爬虫是一种按照一定的规则,自动抓取网页信息的程序。爬虫也叫网页蜘蛛、蚂蚁、小水滴,是一种基于特定算法的自动化程序,能够按照一定的规则自动的抓取网页中的信息。爬虫程序的主要作用就是从一个网站或者一个网页中抓取所需

    2024年02月09日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包