Python类的继承

news/2024/7/19 9:44:32 标签: python, 开发语言, 爬虫

一、类的继承

众所周知,Python是面向对象编程。而面向对象编程主要好处之一便是代码的重用。Python实现代码重用的方法之一是通过继承。

继承是类和类之间的一种关系,是一种子类和父类的关系。如子类继承父类,而Python类中重要的两个东西便是属性和方法。那么Python的子类是如何继承父类的属性和方法?是选择性继承还是不可更改?下面我们将一一展开说明。Python中有单继承和多继承,单继承即子类继承于一个父类,多继承即子类继承多个类。本文主要介绍常见的单继承。

a.继承父类的方法

首先,我们先看一段代码例子。

python">class Foo:
    def f1(self):
        print('Foo.f1')
    def f2(self):
        print('Foo.f2')
        self.f1()

class H(Foo): # 继承父类Foo
    pass

h = H()
h.f1() # Foo.f1

class Bar(Foo): # 继承父类Foo
    def f1(self):
        print('Bar.f1')

b = Bar()
b.f1() # Bar.f1

这个代码就生动的展示了子类如何继承父类的方法。通常情况下当有了继承关系,子类在查找方法时,先从自己的本身类中寻找方法,如果找到了,就直接调用(如代码中的Bar类);如果找不到该方法就到父类寻找该方法(如代码中的H)。也可以这样理解,当有了继承关系后,子类就直接把父类的方法复制下来了,子类可以重写父类的方法。

既然子类可以重新写父类的方法,那么父类有没有一种方法能够不让子类覆盖自己的方法。Python中提供了双下划线开头的方式将方法设置为私有。

在这里插入图片描述

下面,看一个有意思的例子。我们知道了子类先在自身找方法f2,找不到了再去父类找方法f2。但如果出现了找到的父类方法f2中调用了被子类重写的方法f1,这时是调用父类本身的方法f1还是子类的方法f1呢(有点绕,看下面的代码就容易理解了)。答案是调用子类重写的方法f1。

其实比较有意思的是如果把父类中的方法f1注释掉,即下面代码中Foo类的f1函数注释掉,下面代码运行结果还是和未注释是一样的。

python">class Foo:
    def f1(self):
        print('Foo.f1')
    def f2(self):
        print('Foo.f2')
        self.f1()

class Bar(Foo):
    def f1(self):
        print('Bar.f1')

b = Bar()
b.f2() # Foo.f2, Bar.f1

class Foo:
    def f2(self):
        print('Foo.f2')
        self.f1()

class Bar(Foo):
    def f1(self):
        print('Bar.f1')

b = Bar()
b.f2() # Foo.f2, Bar.f1

好了,如果上述代码的父类Foo中的f1变成私有方法了。那么,这时子类Bar能不能重写f1呢。答案是不能的(加了双下划线的方法是不能从外部调用的)。

python">class Foo:
    def __f1(self):
        print('Foo.f1')
    def f2(self):
        print('Foo.f2')
        self.__f1()

class Bar(Foo):
    def __f1(self):
        print('Bar.f1')

b = Bar()
b.f2() # Foo.f2, Foo.f1
b.__f1() # 报错

b.继承父类的属性

上述代码中的类都没有写属性。那么子类继承父类的属性是啥都不用写就可以直接使用吗?答案是是的。

在这里插入图片描述

那么,如果子类重写了 __init__ 时,就不会调用父类已经定义的 __init__

在这里插入图片描述

那么有一种情况就是子类想要继承父类的属性(也就是父类的__init__该咋办呢)。可以使用super关键字:

在这里插入图片描述

这里是直接把父类的整个__init__都搬过来了。


http://www.niftyadmin.cn/n/156505.html

相关文章

牛牛的旅游纪念品

牛牛在牛市的旅游纪念商店里面挑花了眼,于是简单粗暴的牛牛决定——买最受欢迎的就好了。 但是牛牛的背包有限,他只能在商店的n个物品里面带m个回去,不然就装不下了。 并且牛牛希望买到的纪念品不要太相似,所以导购小姐姐帮助牛牛…

《JavaEE》锁的多种形态

👑作者主页:Java冰激凌 📖专栏链接:JavaEE 一、悲观锁 vs 乐观锁 悲观锁:预期锁冲突的概率很高 乐观锁:预期锁冲突的概率很低 相比而言 悲观锁做的工作更多 但是要付出的成本更多 效率是比较低的 乐观锁做的…

linux 服务器缓存清理

-b,-k,-m,-g show output in bytes, KB, MB, or GB k,m,g显示输出字节,KB,MB,或GB -h human readable output (automatic unit scaling) 可读输出(自动单元缩放) -l show detailed low and h…

MySQL字段长度详解 附实操分析

MySQL字段长度、字符、字节实操详解一、前言二、字节三、字符四、字段长度4.1 例 int(1) 、int(4) 、int(11)4.2 为什么int常被设置为int(11)4.3 varchar(5) 与 varchar(255)4.4 char 与 varchar一、前言 搜了下有关方面的内容发现良莠不齐。大部分人对这方面的内容也比较模糊…

Windows下编译Mitsuba 3

1. 获取源码 打开cmd,打开(cd)要放置Mitsuba3的文件夹,从Mitsuba 3的github仓库上将其拉到本地,执行: git clone --recursive https://github.com/mitsuba-renderer/mitsuba3 由于Mitsuba3还有一些子模块…

Stellar Data Recovery Toolkit 11.0 Crack

Stellar Data Recovery Toolkit多合一数据恢复工具包 一款先进的数据恢复软件,用于从 Mac、Windows、Linux 和 Synology 驱动器恢复数据。 从虚拟驱动器(VMDK、VDI、VHD 和 VHDX)恢复数据。 恢复丢失或无法访问的 RAID 0、RAID 5 和 RAID 6 阵…

【代码训练营】 代码随想录一刷总结

代码随想录一刷总结 今天是2023年3月16日,自从第一题二分法开始已经过去两个多月,参加代码训练营让我收获颇多。 首先当初我在参加训练营的时候就给自己定下规定,当天的题绝不过夜,所以不管事情再多晚上我也会打开电脑把题做完。…

Spring Gateway locator 自动路由兼容context-path

背景 基于Spring Gateway和Eureka 结合的微服务开发方式, 如果使用自动路由解析,可以将微服务上的eureka服务ID当成路由的key,从而能够根据网关地址服务ID实现服务的自动转发。 Spring Gateway这么配置即可: spring:application…