当前位置: 首页 > news >正文

Python---关联与继承

专栏:python
个人主页:HaiFan.
专栏简介:Python在学,希望能够得到各位的支持!!!

关联与继承

  • 前言
  • has a关联关系
  • is a继承关系
    • 子类不添加__init__
    • 子类添加__init__

前言

在这里插入图片描述

has a关联关系

has - a 是在一个类中使用了另一种自定义的类型。

看代码

import randomclass Road:def __init__(self,name,len):self.name = nameself.len = lenclass Car:def __init__(self,brand,speed):self.brand = brandself.speed = speeddef get_time(self,road):ran_time = random.randint(1,10)msg = f'{self.brand}品牌的车在{road.name}上以{self.speed}速度行驶了{ran_time}个小时'print(msg)def __str__(self):return f'{self.brand}品牌的\n速度{self.speed}'r = Road('nb',111)c = Car('shangtian',130)print(c)c.get_time(r)

这个代码中的 get_time中的road和r是一样的,指向同一块空间,如果在传参的时候,不传r对象,那么,get_time里面是没有name这个属性的,r可以.调用属性,road.也可以调用属性
在这里插入图片描述


在这里插入图片描述
我把这个r对象中的name进行更改,因为r和road指向的是同一块空间,所以,r.name改变之后,road.name也会改变


  1. has a
    一个类中使用了另一种自定义类型就是关联关系
    如上面代码中c对象中的参数是r对象

is a继承关系

is - a简单来说就是继承关系,类的父子继承关系。

子类不添加__init__

在以后的开发过程中,我们会碰到很多情况,比如,让我们写多个类:医生类,学生类等等,在每一个类里面,都会写名字,性别,年龄等,一个一个的类写是比较繁琐的,在这里,Python给出了解决办法

class Student:def __init__(self,name,age):self.name = nameself.age = agedef eat(self):print(f'{self.name}正在吃饭')class Doctoe:def __init__(self, name, age):self.name = nameself.age = agedef eat(self):print(f'{self.name}正在吃饭')

这个代码中,有着很多重复的代码,并且这些类都有一个共同的特征,那么就可以提取出来他们共同的部分,写做一个类,将其共同的特征都写入这个类中。这个类就是父类

class Person:def __init__(self,name,age):self.name = nameself.age = agedef eat(self):print(f'{self.name}正在吃饭')class Student:passclass Doctoe:passa = Student()a.eat()

在创建出a对象之后,这个对象是找不到eat这个方法的。
因为Student类中为pass
那么,如何让提取出来的共同特征在下面的类中都能体现出来呢?

这就用到了继承关系,把人这一类称为父类,把属于人这一类的类,称为子类。

class 父名字:pass
class 类名(父类名字):pass

在这里插入图片描述
为什么在继承之后,还会出现阴影?子类继承父类后,会受到父类的影响,因为父类的__init__有name和age参数,所以子类中也有这两个参数,所以会出现阴影

class Person:def __init__(self,name,age):self.name = nameself.age = agedef eat(self):print(f'{self.name}正在吃饭')class Student(Person):passclass Doctoe(Person):passa = Student('lise',19)
a.eat()

在这里插入图片描述


我们创建一个类,默认继承是object,在Python3中,我们不写(object),默认继承object

我们知道,Python代码是依次执行的,所以再上面的代码中,会先通过__new__魔术方法开辟一段空间,然后把空间传给__init__.


这个__new__是object的,如果自己没有就会先去父类找,父类没有,就会去object找,再比如__init__,Student类里面是没有这个魔术方法的,那么就会先去父类找。

本层找不到,就去上层找

子类添加__init__

lass Person:def __init__(self):self.name = 'lisi'self.age = 19def eat(self):print(f'{self.name}正在吃饭')def run(self):print(f'{self.namme}正在跑步')class Student(Person):def __init__(self):print('-------init')class Employee(Person):passclass Doctor(Person):passa = Student()

在这里插入图片描述
创建a对象,然后运行代码,会打印出执行__init__的结果。

如果再加一个a.eat()呢?
在这里插入图片描述
这就错了。
在这里插入图片描述


那么,如何调用父类的 __init__呢?

这里我们用到了 super关键字

在这里插入图片描述

如何调用父类 __init__

  1. super(). __init__(参数)
  2. super(类名,对象).__init__(参数)
class Person:def __init__(self):self.name = 'lisi'self.age = 19def eat(self):print(f'{self.name}正在吃饭')def run(self):print(f'{self.namme}正在跑步')class Student(Person):def __init__(self):print('-------init')super().__init__()
class Employee(Person):passclass Doctor(Person):passa = Student()

在这里插入图片描述


在这里插入图片描述


  1. 如果类中不定义 __init__,就调用父类的 __init__

  2. 如果类继承父类也需要定义自己的 __init__,就需要在当前类的 __init__调用一下父类 __init__

  3. 如何调用父类 __init__

    1. super(). __init__(参数)
    2. super(类名,对象).__init__(参数)
  4. 如果父类有eat(),子类也定义一个eat方法,默认搜索原则:先找当前类,再去找父类。

    父类提供的方法不能满足子类的需求,就需要在子类中定义一个同名的方法,这种行为叫做:重写 override\

  5. 子类的方法中也可以调用的父类的方法,

    super().eat()

http://www.lryc.cn/news/19793.html

相关文章:

  • 数据库行业的 “叛逆者”:大数据已“死”,MotherDuck 当立
  • Linux->进程优先级
  • loki 日志管理的安装部署使用
  • CTFer成长之路之反序列化漏洞
  • Python学习-----模块5.0(文件管理大师-->os模块)
  • 第45届世界技能大赛“网络安全”赛项浙江省选拔赛竞赛任务书
  • 【uniapp微信小程序】跨平台使用echarts的方案选择踩坑
  • WAF渗透攻防实践(16)
  • 高并发场景下机器性能优化sop
  • 【女程序员进大厂面试经验】
  • 计算机网络笔记(复试准备)第一章
  • WooCommerce 上传文件 Vanquish v71.6
  • zabbix4.0 Web页面配置 - 聚合图形的实现
  • 计算机网络 — UDP协议(看这一篇就可以
  • Pikachu靶场(暴力破解)
  • 浅谈script,link,import,@import引入
  • 【CSS】CSS 层叠样式表 ① ( 简介 | CSS 引入方式 - 内联样式 | 内联样式语法 | 内联样式缺点 )
  • 12.STM32系统定时器-SysTick
  • 28张图讲解支付系统的通用设计,漂亮!
  • 【5】linux命令每日分享——touch创建文件
  • TypeScript快速上手语法+结合vue3用法
  • 一,下载iPerf3最新源代码
  • keithley6487/吉时利6487皮安表
  • sql命令大全
  • Ubuntu 定时执行脚本
  • Python带你制作一个属于自己的多功能音乐播放器
  • Redis 被问麻了...
  • 使用JavaScript+Selenium玩转Web应用自动化测试
  • [架构之路-119]-《软考-系统架构设计师》-计算机体系结构 -1- 基本原理(体系结构、指令系统与流水线、层次存储)
  • 【离线数仓-8-数据仓库开发DWD层-交易域相关事实表】