Python笔记18-继承&函数重写

2023-11-04

一、继承【重点掌握】

1.概念

如果两个或者两个以上的类具有相同的属性和方法,我们可以抽取一个类出来,在抽取出来的类中声明各个类公共的部分

被抽取出来的类——父类【father class】  超类【super class】  基类【base class】

两个或两个以上的类——子类  派生类

他们之间的关系——子类 继承自 父类   或者   父类  派生了 子类

# 父类【Father】、超类【Super】、基类【Base】
class Person(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def eat(self):
        print("eating")

# 子类、派生类
class Student(Person):
    def __init__(self,name,age,type):
        self.type = type
    def study(self):
        print("studying")
class Worker(Person):
    def __init__(self,name,age,kind):
        self.kind = kind
    def work(self):
        print("working")
class Doctor(Person):
    pass

class Teacher(Person):
    def teach(self):
        print("teaching")

"""
总结:
    1.如果要实现继承,则定义子类的时候,class 子类类名(父类类名)
    2.object是所有类的根类
    3.使用继承之后,可以简化代码
    4.子类除了可以继承父类中的内容之外,还可以有自己特有的属性和方法,达到了易于扩展的特点
"""

2.单继承

2.1基本使用

简单来说,一个子类只有一个父类,被称为单继承

语法:

class 子类类名(父类类名):

类体

注意:object是Python中所有类的根类

默认情况下,如果一个类没有指明继承的父类,则默认继承自object

# 父类【Father】、超类【Super】、基类【Base】
class Person(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def eat(self):
        print("eating")

# 子类、派生类
class Doctor(Person):
    pass

# 1.注意1:如果子类中未定义构造函数,创建子类对象,默认调用父类中的构造函数,所以需要和父类中的__init__注意参数的匹配
d = Doctor("张医生",30)
d.eat()
print(d.name,d.age)

# 注意2:子类可以继承父类中未被私有化的属性和函数

# 2.
class Teacher(Person):
    def teach(self):
        print("teaching")
t = Teacher("王老师",40)
t.eat()
t.teach()

# 3.注意3:如果子类中定义了构造函数,则创建子类对象的时候,调用的是子类中的构造函数
class Student(Person):
    def __init__(self,type):
        self.type = type
    def study(self):
        print("studying")
s = Student("中学生")
print(s.type)
s.eat()
s.study()

# 4.在实际应用中,常用的情况【重点掌握】
# 注意4:如果子类中定义了构造函数,其中需要继承父类中的属性,并定义了特有的属性,
# 需要在子类的构造函数中调用父类中的构造函数
class Worker(Person):
    def __init__(self,name,age,kind):

        # 方式一:super(当前类,self).__init__(属性列表)
        # super(Worker, self).__init__(name,age)
        # 方式二:super().__init__(属性列表)
        # super().__init__(name,age)
        # 方式三:父类类名.__init__(self,属性列表)
        Person.__init__(self,name,age)

        self.kind = kind
    def work(self):
        print("working")

w = Worker('工人',25,"电器")
print(w.kind)
print(w.name,w.age)
w.eat()
w.work()

2.2继承中的slots

class Person(object):
    __slots__ = ("name","age")
    def __init__(self,name,age):
        self.name = name
        self.age = age

p = Person('aaa',10)
# p.hobby = "唱歌"

class Student(Person):
    pass

s = Student("bbb",20)
print(s.name,s.age)
s.hobby = "跳舞"
print(s.hobby)

# 结论:在父类中定义的属性的限制绑定【__slots__】,不会被子类继承,如果同样需要,则需要手动设置

2.3继承中的类属性

# 1
class Person():
    place = "地球"
class Student(Person):
    pass

# 注意1:子类可以继承父类中未被私有化的类属性,使用和实例属性相同
print(Person.place)
print(Student.place)

# 注意2:如果通过父类修改类属性,子类中访问到的类属性会随着修改
Person.place = "火星"
print(Person.place)
print(Student.place)

# 注意3:如果通过子类修改类属性【来自于父类】,对父类中访问的类属性没有影响
Student.place = "太空"
print(Person.place)
print(Student.place)

# 2.【面试题】
class A():
    x = 1
class B(A):
    pass
class C(A):
    pass

print(A.x,B.x,C.x)    # 1 1 1
A.x = 2
print(A.x,B.x,C.x)    # 2 2 2
B.x = 3
print(A.x,B.x,C.x)    # 2 3 2

3.多继承

顾名思义,多继承就是一个子类可以有多个父类,比如:一个孩子有一个父亲,一个母亲

语法:

class 子类(父类1, 父类2, 父类3。。。。):

类体

注意:object是所有类的根类

# 1.
class Runnale(object):
    def run(self):
        print("running")
class Flyable(object):
    def fly(self):
        print("flying")

# 单继承
class Dog(Runnale):
    pass

# 多继承
class Bird(Runnale,Flyable):
    pass

# 2.
class Father(object):
    def __init__(self,money):
        self.money = money
    def play(self):
        print("playing")
    def show(self):
        print("father~~~~show")

class Mother(object):
    def __init__(self,face_value):
        self.face_value = face_value
    def eat(self):
        print("eating")
    def show(self):
        print("mother~~~~show")

# a.
class Child1(Mother,Father):
    pass

# 注意1:子类中未定义构造函数,创建子类对象的时候,默认调用父类列表中第一个父类中的构造函数
# c1 = Child1(10)
# print(c1.face_value)

# b.
class Child2(Mother,Father):
    def __init__(self,money,face_value,hobby):

        # 注意2:和单继承的使用相同,如果在子类中需要使用父类中的实例属性,则在子类的构造函数中调用父类中的构造函数
        # 注意3:在子类的构造函数中调用父类中的构造函数,使用super()都只能调用父类列表中第一个父类中的构造函数
        # 如果所有父类的构造函数都需要调用,只能使用  父类类名.__init__(self,属性列表)
        Father.__init__(self, money)
        Mother.__init__(self, face_value)
        self.hobby = hobby

    def study(self):
        print("studying")

    # 扩展性
    def show(self):
        # super().show()   # 只会调用的是父类列表中第一个父类中的函数
        Father.show(self)
        Mother.show(self)
        print("child~~~~~show")

c2 = Child2(13,45,'跑步')
c2.play()
c2.eat()
c2.study()
print(c2.money,c2.face_value,c2.hobby)
# 注意4:如果多个父类中出现了重名的函数,子类对象在调用的时候,默认调用的是父类列表中第一个父类中的函数

c2.show()

4.多继承的特点

二、函数重写【重点掌握】

"""
函数重写:override
前提:在继承的情况下
使用:如果在子类中重新实现了父类中的函数,这个过程被称为函数的重写
判断标准:只要子类中出现和父类中重名的函数,换句话说,子类中某个函数的声明和父类中某个函数的声明完全相同,就是重写,
"""

# 1.自定义函数的重写
# a
class Person():
    def func(self):
        print("父类~~~~func")
class Child(Person):
    pass

c = Child()
c.func()

# b
class Person():
    def func(self):
        print("父类~~~~func")
class Child(Person):
    def func(self):
        print("子类~~~~func")
c = Child()
c.func()

# c.注意:当一个父类有多个子类的时候,父类中实现的函数满足大多数子类的使用,只有少数子类中无法使用,
# 则可以在子类中重新实现父类中的指定函数
class Animal():
    def walk(self):
        print("地面行走")
class Dog(Animal):
    pass
class Cat(Animal):
    pass
class Bird(Animal):
    def walk(self):
        print("天空中飞行")
class Elephant(Animal):
    pass


# 2.系统函数的重写
# a.
class Person1(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
# 默认情况下,打印对象的时候,会调用object中的__str__(),该函数默认返回一个表示当前对象地址的字符串
p1 = Person1('张三',10)
print(p1)
print(p1.__str__())

# b.
class Person2(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
    # 如果希望打印对象的时候,获取的结果是当前对象的属性信息,则需要在子类中重写__str__,
    # 该函数只能返回一个字符串,所以建议将对象的属性信息格式化成一个字符串返回
    def __str__(self):
        return f"姓名:{self.name},年龄:{self.age}"

    # def __repr__(self):
    #     return f"姓名:{self.name},年龄:{self.age}"
    __repr__ = __str__

p2 = Person2('张三',10)
print(p2)
# print(p2.__str__())

# 如果对象以元素的形式存在于列表等可迭代对象中,直接打印可迭代对象,默认情况下,该对象还是以地址的形式出现
# 如果列表中也需要显示属性信息,则需要重写__repr__
list1  = [p2]
print(list1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python笔记18-继承&函数重写 的相关文章

随机推荐

  • 16进制转字符串

    public function hex2str hex str arr str split hex 2 foreach arr as bit str chr hexdec bit return str
  • 关于Unity3D 游戏音频控制脚本C#代码

    using UnityEngine using System Collections public class SoundManager MonoBehaviour private static SoundManager instance
  • java IO流注意项总结

    IO流有很多种 按照操作数据的不同 可以分为字节流和字符流 按照数据传输方向的不同又可分为输入流和输出流 程序从输入流中读取数据 向输出流中写入数据 在IO包中 字节流的输入输出流分别用java io InputStream和java io
  • C/C++ 指向字符的指针为什么可以用字符串来初始化,而不是字符地址。

    感谢大佬 YLEOY https blog csdn net leigelaile1 article details 77511323 本文是通过几篇转帖的文章整理而成的 内容稍有修改 一 C语言中 为什么字符串可以赋值给字符指针变量 ch
  • H - Give Me This Pizza(栈stack)

    H Give Me This Pizzahttps vjudge csgrandeur cn problem Gym 101343H include
  • UE4 C++调用蓝图事件(单个参数)

    UE4 C 调用蓝图事件 C 先在头文件上面声明一个代理 我需要传递参数所以声明了一个单参数的代理 名字要以F开头 不然编译不通过 DECLARE DYNAMIC MULTICAST DELEGATE OneParam FCNUtf8Str
  • STM32的简单的SD卡读写

    导读 SD卡一般支持两种读写模式 SPI和SDIO模式 SD卡的引脚排序如下图所示 SPI模式下有几个重要的操作命令 分别是 SD卡R1回应的格式如下SPI模式下的典型初始化过程如下 1 初始化硬件配置 SPI配置 IO配置等 SD卡一般支
  • C++类和对象:对象的初始化和清理

    C 类和对象 对象的初始化和清理 1 构造函数与析构函数 2 构造函数的分类与调用 2 1 分类 2 2 调用 3 拷贝函数的调用时机 4 构造函数的调用规则 5 深拷贝与浅拷贝 6 初始化列表 7 类对象作为类成员 8 静态成员 8 1
  • JAVA操作Excel文件

    JAVA EXCEL API 是一开放源码项目 通过它Java开发人员可以读取Excel文件的内容 创建新的Excel文件 更新已经存在的Excel文件 使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表 因
  • uniapp app 实现右上角回首页;点homeButton返回上一页;onNavigationBarButtonTap不生效问题

    场景 app Android移动端 实现点击右上角图标 回首页 问题 用了官网的 homeButton 图标正常展示了 也可点击 但每次点击后是会返回上一页而非首页 后来查到说 要结合onNavigationBarButtonTap生命周期
  • 关于STM32中ADC原理

    该文章内容来源于江协助科技 如有侵权 联系删除 目录 ADC原理 逐次逼近型ADC ADC框图介绍 注入通道 规则通道介绍 ADC基本结构 重点 转换模式 数据对齐 内部校准 ADC原理可以将引脚上连续变化模拟电压转换为内存中存储的数字变量
  • 区块链Fabric-从入门到实战(一)

    加密算法 加密算法分对称加密算法和非对称加密算法 在区块链中主要使用的时非对称加密算法 非对称加密是指为满足安全性需求和所有权验证需求而集成到区块链中的加密技术 非对称加密在加密和解密过程中 使用两个非对称的密钥 分别为公钥和私钥 非对称密
  • Android studio设置快捷键

    Android studio 设置快捷键 因为习惯用eclipse快捷键 所以将Androidstudio的快捷键设置成eclipse快捷键一致 首先在setting keymap 复制一份eclipse 这样就是eclipse的快捷键 以
  • 如何用matlab画泰勒图

    前几天写文章 想画一些泰勒图 我觉得其实这个泰勒图吧 包含的信息也并不多 只是看起来比较直观 且看起来逼格比较高 就谷歌了一下怎么画 先找到的是这个代码 但是有毒 死活跑不通 不知为何 且评论里大家和我的问题都一毛一样 遂重找 http c
  • ctfshow web15-web25详细思路

    web15 提示 公开的信息比如邮箱 可能造成信息泄露 产生严重后果 进入题目后看到有个QQ邮箱 我们搜一下它的QQ 没啥信息 返回到刚才的网站加后缀看能不能进去后台 不知道用户名密码哎 那忘记密码吧 发现一个信息 刚才搜的QQ用户在西安
  • 十、Update 存储过程

    文章目录 修改数据的要求 存储过程中的数据库异常 我们需要数据库异常 MariaDB 发起异常 SIGNAL和RESIGNAL mariaDB 捕获异常 捕获指定异常 捕获自定义异常 获取异常消息 update 锁及其测试 Update 锁
  • 通过Dockerfile启动容器遇到的两个不常见错误

    1 报错 ImportError cannot import name cached property from werkzeug 安装更高级的版本 pip install Werkzeug 0 16 0 2 已安装pip 执行python
  • Python入门--关键字

    关键字是Python编程语言中具有特殊含义的保留单词 不能用作变量名 函数名 类名或其他标识符 以下是Python 3 9 0版本中的关键字列表 False None True and as assert async await break
  • 将 varchar 转换为数据类型 numeric 时出现算术溢出错误

    SQL Server 2005 中 如果使用5位以上的字符串转换为numeric时就会出现 将 varchar 转换为数据类型 numeric 时出现算术溢出错误 这样的错误 如果使用5位以下 含5位 的就不会出错
  • Python笔记18-继承&函数重写

    一 继承 重点掌握 1 概念 如果两个或者两个以上的类具有相同的属性和方法 我们可以抽取一个类出来 在抽取出来的类中声明各个类公共的部分 被抽取出来的类 父类 father class 超类 super class 基类 base clas