Python之多重继承
一、多重继承
Python支持多重继承,一个子类可以有多个“直接父类”。这样,就具备了“多个父类”的特点。但是由于,这样会被“类的整体层次”搞的异常复杂,尽量避免使用。
class A:def aa(self):print("aa")
class B:def bb(self):print("bb")
class C(B,A):def cc(self):print("cc")
c = C()
c.cc()
c.bb()
c.aa()
类结构为:
二、MRO方法解析顺序
Python支持多继承,如果父类中有相同名字的方法,在子类没有指定父类名时,解释器将“从左向右”按顺序搜索。
MRO(Method Resolution Order):方法解析顺序。 我们可以通过mro()
方法获得“类的层次结构”,方法解析顺序也是按照这个“类的层次结构”寻找的。
class A:def aa(self):print("aa")
def say(self):print("say AAA!")
class B:def bb(self):print("bb")
def say(self):print("say BBB!")
class C(B,A):def cc(self):print("cc")
c = C()
print(C.mro()) #打印类的层次结构
c.say() #解释器寻找方法是“从左到右”的方式寻找,此时会执行B类中的say()
执行结果:
[main.C'>, main.B'>, main.A'>, ] say BBB!
三、super()获得父类定义
在子类中,如果想要获得父类的方法时,我们可以通过super()
来做。
super()
代表父类的定义,不是父类对象。
❤️想调用父类的构造方法:
super(子类名称,self).__init__(参数列表)
class A:def __init__(self):print("A的构造方法")
def say(self):print("A: ",self)print("say AAA")
class B(A):def __init__(self):super(B,self).__init__() #调用父类的构造方法print("B的构造方法")def say(self):#A.say(self) 调用父类的say方法super().say() #通过super()调用父类的方法print("say BBB")
b = B()
b.say()
运行结果:
A: <__main__.B object at 0x007A5690>
say AAA
say BBB
四、多态
多态(polymorphism)是指同一个方法调用由于对象不同可能会产生不同的行为。
比如:现实生活中,同一个方法,具体实现会完全不同。 比如:同样是调用人“吃饭”的方法,中国人用筷子吃饭,英国人用刀叉吃饭,印度人用手吃饭。
关于多态要注意以下2点:
- 多态是方法的多态,属性没有多态。
- 多态的存在有2个必要条件:继承、方法重写
#多态
class Animal:def shout(self):print("动物叫了一声")
class Dog(Animal):def shout(self):print("小狗,汪汪汪")
class Cat(Animal):
def shout(self):print("小猫,喵喵喵")
def animalShout(a):a.shout() #传入的对象不同,shout方法对应的实际行为也不同。
animalShout(Dog())
animalShout(Cat())
五、特殊方法和运算符重载
Python的运算符实际上是通过调用对象的特殊方法实现的。
a = 20
b = 30
c = a+b
d = a.__add__(b)
print("c=",c)
print("d=",d)
运算结果:
c= 50
d= 50
常见的特殊方法统计如下:
方法 | 说明 | 例子 |
---|---|---|
__init__ | 构造方法 | 对象创建和初始化:p = Person() |
__del__ | 析构方法 | 对象回收 |
__repr__ ,__str__ | 打印,转换 | print(a) |
__call__ | 函数调用 | a() |
__getattr__ | 点号运算 | a.xxx |
__setattr__ | 属性赋值 | a.xxx = value |
__getitem__ | 索引运算 | a[key] |
__setitem__ | 索引赋值 | a[key]=value |
__len__ | 长度 | len(a) |
每个运算符实际上都对应了相应的方法,统计如下:
运算符 | 特殊方法 | 说明 |
---|---|---|
+ | __add__ | 加法 |
- | __sub__ | 减法 |
< <= == | __lt__ __le__ __eq__ | 比较运算符 |
> >= != | __gt__ __ge__ __ne__ | 比较运算符 |
| ^ & | __or__ __xor__ __and__ | 或、异或、与 |
<< >> | __lshift__ __rshift__ | 左移、右移 |
* / % // | __mul__ __truediv__ __mod__ __floordiv__ | 乘、浮点除、模运算(取余)、整数除 |
** | __pow__ | 指数运算 |
我们可以重写上面的特殊方法,即实现了“运算符的重载”。
#测试运算符的重载
class Person:def __init__(self,name):self.name = name
def __add__(self, other):if isinstance(other,Person):return "{0}--{1}".format(self.name,other.name)else:return "不是同类对象,不能相加"
def __mul__(self, other):if isinstance(other,int):return self.name*otherelse:return "不是同类对象,不能相乘"
p1 = Person("高淇")
p2 = Person("高希希")
x = p1 + p2
print(x)
print(p1*3)
运算结果:
高淇--高希希
高淇高淇高淇
相关文章:

Python之多重继承
一、多重继承 Python支持多重继承,一个子类可以有多个“直接父类”。这样,就具备了“多个父类”的特点。但是由于,这样会被“类的整体层次”搞的异常复杂,尽量避免使用。 class A:def aa(self):print("aa") class B…...

前端CSS文字阴影text-shadow记录
前端CSS文字阴影text-shadow记录 一、文字阴影 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Doc…...

maven 删除下载失败的包
本文介绍了当Maven包报红时,使用删除相关文件的方法来解决该问题。文章详细说明了_remote.repositories、.lastUpdated和_maven.repositories文件的作用,以及如何使用命令行删除这些文件。这些方法可以帮助开发者解决Maven包报红的问题,确保项…...

《吐血整理》高级系列教程-吃透Fiddler抓包教程(37)-掌握Fiddler中Fiddler Script用法你有多牛逼-下
1.简介 Fiddler是一款强大的HTTP抓包工具,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有很大的帮助。Fiddler提供的功能基本上能…...

网络安全进阶学习第十二课——SQL手工注入3(Access数据库)
文章目录 注入流程:1、判断数据库类型2、判断表名3、判断列名4、判断列数1)判断显示位 5、判断数据长度6、爆破数据内容 注入流程: 判断数据库类型 ——> 判断表名 ——> 判断列名 ——> 判断列名长度 ——> 查出数据。 asp的网…...
Zookeeper集群+Kafka集群
目录 一丶Zookkeeper概述 二、Zookeeper 特点 2.1Zookeeper 应用场景 2.2Zookeeper 选举机制 2.2.1第一次启动选举机制 2.2.2非第一次启动选举机制 三、部署 Zookeeper 集群 3.1//安装 JDK 3.2安装 Zookeeper 3.2.1修改配置文件 3.2.2拷贝配置好的 Zookeeper 配置文件…...

管理类联考——逻辑——论证逻辑——汇总篇——目录+提炼
文章目录 一、削弱方法关系的削弱必要方法的削弱因果推理的削弱果因推理的削弱概念跳跃的削弱数量比例的削弱比例因果的削弱 二、支持方法关系的支持必要方法的支持因果推理的支持果因推理的支持概念跳跃的支持数量比例的支持比例因果的支持 三、假设方法关系的假设必要方法的假…...

用excel格式书写的接口用例执行脚本
创建测试用例和测试结果集文件夹: excel编写的接口测试用例如下: 1 encoding 响应的编码格式。所测项目大部分是utf-8,有一个特殊项目是utf-8-sig 2 params 对应requests的params 3 data,对应requests的data 有些参数是动态的&a…...

【flink】Chunk splitting has encountered exception
执行任务报错: Chunk splitting has encountered exception 错误信息截图: 完整的错误信息: 16:30:43,911 ERROR org.apache.flink.runtime.source.coordinator.SourceCoordinator [SourceCoordinator-Source: CDC Sourceorg.jobslink.flink…...

单元测试用例分组 demo
文章目录 目标1、使用 Category 进行用例分组(1)设置用例组(2)编写测试类,case设置对应的用例组(3)编写执行类(4)查看运行结果(5)联系项目 2、参数…...

观察者模式(Observer)
观察着模式是一种行为设计模式,可以用来定义对象间的一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。 观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图…...

20天学会rust(二)rust的基础语法篇
在第一节(20天学rust(一)和rust say hi)我们配置好了rust的环境,并且运行了一个简单的demo——practice-01,接下来我们将从示例入手,学习rust的基础语法。 首先来看下项目结构: 项目…...

Stephen Wolfram:嵌入的概念
The Concept of Embeddings 嵌入的概念 Neural nets—at least as they’re currently set up—are fundamentally based on numbers. So if we’re going to to use them to work on something like text we’ll need a way to represent our text with numbers. And certain…...
springboot,swagger多个mapper包,多个controller加载问题
启动类添加MapperScan({"xxx.xxx.xxx.mapper","xxx.xxx.xxx.mapper"}) swagger配置类添加 Bean public Docket api01() {return new Docket(DocumentationType.SWAGGER_2)//.enable(swagger_is_enabl).apiInfo(new ApiInfoBuilder().title("你的title…...
湖大CG满分教程:作业训练四编程题20. 回文串(暴力×动态规划算法√)
问题描述 “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。给你一个字符串,问最少在字符串尾添加多少字符,可以使得字符串变为回文串。 输入格式 有多组测试数据。 每组测试数据第一行是一个正整数N…...

使用toad库进行机器学习评分卡全流程
1 加载数据 导入模块 import pandas as pd from sklearn.metrics import roc_auc_score,roc_curve,auc from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression import numpy as np import math import xgboost as xgb …...
Python数据容器——列表(list)
数据容器入门 Python中的数据容器: 一种可以容纳多份数据的数据类型,容纳的每一份数据称之为1个元素 每一个元素,可以是任意类型的数据,如字符串、数字、布尔等。 数据容器根据特点的不同,如:是否支持重复元…...

Linux CEF(Chromium Embedded Framework)源码下载编译详细记录
Linux CEF(Chromium Embedded Framework)源码下载编译 背景 由于CEF默认的二进制分发包不支持音视频播放,需要自行编译源码,将ffmpeg开关打开才能支持。这里介绍的是Linux平台下的CEF源码下载编译过程。 前置条件 下载的过程非…...
Adaptive AUTOSAR—— Communication Management 3.1
9 Communication Management 9.1 What is Communication Management? 通信管理是自适应平台架构中的一个功能集群。 作为一个功能集群,通信管理向应用程序提供了一个C++ API,实现了面向服务的通信。服务是一个由应用程序提供的功能单元,可以在运行时被另一个应用程序动态…...

VMnet0 桥接设置
VMnet0 一定要设置为你的硬件物理网卡,不能设置自动,不然后,网线一断,就再也连不上了。必须重启电脑才能连上,这个问题找了很久才找到。 下面有个hyper-V虚拟网卡,如果选自动的话,物理网卡一掉…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...