Python 抽象类
在Python的抽象基类(ABC)中,方法并不是必须全部是抽象方法。抽象基类可以同时包含抽象方法和具体方法。抽象类中可以有抽象方法
也可以定义具体方法
具体来说:
-
抽象方法:
- 使用
@abc.abstractmethod
装饰器标记的方法是抽象方法。 - 抽象方法没有方法体,只有方法签名。
- 抽象方法必须在具体子类中实现。
- 使用
-
具体方法:
- 不使用
@abc.abstractmethod
装饰的方法是具体方法。 - 具体方法可以有方法体,提供默认的实现。
- 子类可以继承并使用这些具体方法,也可以选择重写它们。
- 不使用
这种混合方式提供了更大的灵活性。抽象基类可以定义一些必须被实现的行为(抽象方法),同时也可以提供一些通用的功能(具体方法),让子类可以直接使用。
下面是一个示例:
import abcclass Animal(metaclass=abc.ABCMeta):@abc.abstractmethoddef make_sound(self):"""子类必须实现此方法"""passdef eat(self):print("Animal is eating.")class Dog(Animal):def make_sound(self):print("Woof!")class Cat(Animal):def make_sound(self):print("Meow!")def eat(self):print("Cat is eating.")
在这个例子中:
Animal
类是一个抽象基类,它包含一个抽象方法make_sound()
和一个具体方法eat()
。Dog
和Cat
类继承自Animal
,它们必须实现make_sound()
方法,但可以选择是否重写eat()
方法。Cat
类选择重写了eat()
方法,提供了自己的实现。
总之,在Python的抽象基类中,方法不必全部是抽象方法,具体方法也是可以存在的。这种灵活性使得抽象基类可以更好地定义和共享通用的功能。
@abstractmethod同样可以施加到静态方法、类方法和property属性上。只要确保以合适的顺序进行添加即可,这里@abstractmethod要紧挨着函数定义
是的,在Python的抽象基类中,@abstractmethod
装饰器不仅可以用于普通方法,还可以用于静态方法、类方法和属性(property)。下面我们来看一些示例代码:
- 抽象静态方法:
import abcclass Animal(metaclass=abc.ABCMeta):@staticmethod@abc.abstractmethoddef compare_animals(animal1, animal2):"""子类必须实现此静态方法"""passclass Dog(Animal):@staticmethoddef compare_animals(animal1, animal2):if isinstance(animal1, Dog) and isinstance(animal2, Dog):print(f"Comparing two dogs.")else:print(f"Cannot compare a dog with a non-dog.")
- 抽象类方法:
import abcclass Animal(metaclass=abc.ABCMeta):@classmethod@abc.abstractmethoddef get_species(cls):"""子类必须实现此类方法"""passclass Dog(Animal):@classmethoddef get_species(cls):return "Canis familiaris"
- 抽象属性:
import abcclass Animal(metaclass=abc.ABCMeta):@property@abc.abstractmethoddef num_legs(self):"""子类必须实现此属性"""passclass Dog(Animal):@propertydef num_legs(self):return 4
在这些示例中:
- 在
Animal
抽象基类中,我们分别定义了一个抽象静态方法compare_animals()
、一个抽象类方法get_species()
和一个抽象属性num_legs
。 - 在具体的
Dog
子类中,我们实现了这些抽象定义,满足了抽象基类的要求。
使用@abstractmethod
装饰器可以确保子类必须实现这些抽象定义,否则子类也会成为抽象类,无法被实例化。
这种灵活性使得抽象基类可以更好地定义和约束接口,提高代码的可维护性和可扩展性。开发者可以根据需求选择使用普通方法、静态方法、类方法或属性来定义抽象接口。
尽管抽象基类使得类型检查变得更容易了,但不应该在程序中过度使用它。Python的核心在于它是一种动态语言,它带来了极大的灵活性。如果处处都强制实行类型约束,则会使得代码变得更加复杂,而这本不应该如此。我们应该拥抱Python的灵活性
相关文章:
Python 抽象类
在Python的抽象基类(ABC)中,方法并不是必须全部是抽象方法。抽象基类可以同时包含抽象方法和具体方法。抽象类中可以有抽象方法也可以定义具体方法 具体来说: 抽象方法: 使用abc.abstractmethod装饰器标记的方法是抽象方法。抽象方法没有方法体,只有方法签名。抽象方法必须在具…...
达梦数据库自动备份(全库)+还原(全库) 控制台
一 前提 1.安装达梦数据库DB8(请参照以前文章) 我的数据库安装目录是 /app/dmDB8 2.已创建实例 (请参照上一篇文章) 二 准备测试数据 三 自动备份步骤 1.开启归档模式 开启DM管理工具管理控制台 弹不出来工具的 输入命令 xhost 第一步 将服务器转换为配置状态 右键-&g…...
android AndroidAutoSize 取消第三方库适配问题(两个步骤)
比如第三方库的Activity是:PictureSelectorSupporterActivity、PictureSelectorTransparentActivity、CropImageActivity 1.在自定义Application 的 onCreate 方法设置: Overridepublic void onCreate() {super.onCreate();this.mAppthis;registerActi…...
【Java 多线程】从源码出发,剖析Threadlocal的数据结构
文章目录 exampleset(T value)createMap(t, value);set(ThreadLocal<?> key, Object value)ThreadLocalMap和Thread的关系 全貌 ThreadLocal是个很重要的多线程类,里面数据结构的设计很有意思,很巧妙。但是我们平时使用它的时候常常容易对它的使用…...
Sy6 编辑器vi的应用(+shell脚本3例子)
实验环境: 宿主机为win11,网络:10.255.50.5 6389 WSL2 ubuntu 目标机的OS:Ubuntu 内核、版本如下: linuxpeggy0223:/$ uname -r 5.15.146.1-microsoft-standard-WSL2 linuxpeggy0223:/$ cat /proc/version Linux vers…...
把标注数据导入到知识图谱
文章目录 简介数据导入Doccano标注数据,导入到Neo4j寻求帮助 简介 团队成员使用 Doccano 标注了一些数据,包括 命名实体识别、关系和文本分类 的标注的数据; 工作步骤如下: 首先将标注数据导入到Doccano,查看一下标注…...
【前端基础】什么是类数组对象,类数组对象转换成数组的方法
类数组对象(array-like object)是指在 JavaScript 中具有类似数组的特征但不是真正的数组的对象。这些对象具有类似数组的特性,例如有一个 length 属性和通过索引访问元素的能力,但它们不具备数组对象的所有方法和特性。 什么是类…...
Python快速入门系列-8(Python数据分析与可视化)
第八章:Python数据分析与可视化 8.1 数据处理与清洗8.1.1 数据加载与查看8.1.2 数据清洗与处理8.1.3 数据转换与整理8.2 数据可视化工具介绍8.2.1 Matplotlib8.2.2 Seaborn8.2.3 Plotly8.3 数据挖掘与机器学习简介8.3.1 Scikit-learn8.3.2 TensorFlow总结在本章中,我们将探讨…...
双非硕转测试之Java学习笔记(一):集合
Java学习-----集合 简单概括单列集合--collectionlist接口:vector类:LinkedList类:set接口:HasSet类:LinkedHashSet类: 双列集合--MapMap接口:HashMap类:HashTable类:Pro…...
zabbix源码安装
目录 一.安装php和nginx客户端环境 二.修改php配置 三.修改nginx配置文件 四.下载并编译zabbix 五.创建zabbix需要的用户及组 六.安装编译需要的依赖 七.配置zabbix文件 八.数据库配置 九.配置zabbix 十.web界面部署 十一.遇到无法创建配置文件 十二.登录zabbix 前…...
计算机视觉之三维重建(5)---双目立体视觉
文章目录 一、平行视图1.1 示意图1.2 平行视图的基础矩阵1.3 平行视图的极几何1.4 平行视图的三角测量 二、图像校正三、对应点问题3.1 相关匹配法3.2 归一化相关匹配法3.3 窗口问题3.4 相关法存在的问题3.5 约束问题 一、平行视图 1.1 示意图 如下图即是一个平行视图。特点&a…...
计算机网络-TCP/IP 网络模型
TCP/IP网络模型各层的详细描述: 应用层:应用层为应用程序提供数据传输的服务,负责各种不同应用之间的协议。主要协议包括: HTTP:超文本传输协议,用于从web服务器传输超文本到本地浏览器的传送协议。FTP&…...
算法训练营第29天|LeetCode 491.递增子序列 46.全排列 47.全排列Ⅱ
LeetCode 491.递增子序列 题目链接: LeetCode 491.递增子序列 解题思路: 用哈希集合进行去重,同一树层不能取重复元素。 代码: class Solution { public:vector<vector<int>>result;vector<int>path;void…...
Ubuntu服务器搭建 - 环境篇
Ubuntu服务器搭建 - 环境篇 基于腾讯云服务器 - Ubuntu 20.04 LTS 一、安装 - MySQL 1.1 概述 MySQL安装方式有三种: 1. 使用Ubuntu 包管理工具 apt安装 2. 使用MySQL官方APT存储库安装 3. 使用MySQL官方二进制发行版安装 1.2 安装 MySQL 使用MySQL官方APT存储库安装 $ wget…...
深度学习基础模型之Mamba
Mamba模型简介 问题:许多亚二次时间架构(运行时间复杂度低于O(n^2),但高于O(n)的情况)(例如线性注意力、门控卷积和循环模型以及结构化状态空间模型(SSM))已被开发出来,以解决 Transformer 在长…...
Topaz Video AI for Mac v5.0.0激活版 视频画质增强软件
Topaz Video AI for Mac是一款功能强大的视频处理软件,专为Mac用户设计,旨在通过人工智能技术为视频编辑和增强提供卓越的功能。这款软件利用先进的算法和深度学习技术,能够自动识别和分析视频中的各个元素,并进行智能修复和增强&…...
解决WordPress文章的段落首行自动空两格的问题
写文章时,段落首行都会空两格,可是WordPress自带的编辑器却没有考虑到这一点,导致发布的文章首行都是顶格的,看起来很不习惯。 我们通常的解决方法都是在发布文章时把编辑器切换到“文本”模式,然后再在首行手动键入两…...
RISC-V单板计算机模拟和FPGA板多核IP实现
🎯要点 🎯使用单板计算机 Visionfive 2 或模拟器测试RISC-V汇编🎯RISC-V汇编加载和算术。🎯使用GNU MAKE汇编RISC-V指令,ESP32使用CMake编译执行指令。🎯RISC-V汇编功能和使用释义:控制指令&am…...
Mojo编程语言案例及介绍
Mojo是一种新兴的编程语言,它结合了现代编程范式与简洁易读的语法,为开发者提供了一个强大且高效的开发工具。以下将详细介绍Mojo编程语言的特性,并通过一个实际案例来展示Mojo的应用。 一、Mojo编程语言介绍 Mojo编程语言的设计理念是“简单…...
【Python面试题收录】Python中有哪些方法交换两个变量的值?至少给出三种方法。
一、使用临时变量 # 定义原始变量 a 10 b 20# 直接交换,Python会一次性执行两个赋值操作 a, b b, a# 无需额外变量,a 和 b 的值已经交换 print(a) # 输出: 20 print(b) # 输出: 10 二、利用元组解包特性(不使用临时变量,推荐…...
MySQL核心命令详解与实战,一文掌握MySQL使用
文章目录 文章简介演示库表创建数据库表选择数据库删除数据库创建表删除表向表中插入数据更新数据删除数据查询数据WHERE 操作符聚合函数LIKE 子句分组 GROUP BY HAVINGORDER BY(排序) 语句LIMIT 操作符 分页查询多表查询-联合查询 UNION 操作符多表查询-连接的使用-JOIN语句编…...
基于Springboot + MySQL + Vue 大学新生宿舍管理系统 (含源码)
目录 📚 前言 📑摘要 📑操作流程 📚 系统架构设计 📚 数据库设计 💬 管理员信息属性 💬 学生信息实体属性 💬 宿舍安排信息实体属性 💬 卫生检查信息实体属性 &…...
vulnhub pWnOS v2.0通关
知识点总结: 1.通过模块来寻找漏洞 2.msf查找漏洞 3.通过网站源代码,查看模块信息 环境准备 攻击机:kali2023 靶机:pWnOS v2.0 安装地址:pWnOS: 2.0 (Pre-Release) ~ VulnHub 在安装网址中看到,该靶…...
leetcode热题100.数据流的中位数
作者:晓宜 🌈🌈🌈 个人简介:互联网大厂Java准入职,阿里云专家博主,csdn后端优质创作者,算法爱好者 ❤️❤️❤️ 你的关注是我前进的动力😊 Problem: 295. 数据流的中位数…...
C 从函数返回指针
我们已经了解了 C 语言中如何从函数返回数组,类似地,C 允许您从函数返回指针。为了做到这点,您必须声明一个返回指针的函数,如下所示: int * myFunction() { . . . }另外,C 语言不支持在调用函数时返回局部…...
(文章复现)考虑分布式电源不确定性的配电网鲁棒动态重构
参考文献: [1]徐俊俊,吴在军,周力,等.考虑分布式电源不确定性的配电网鲁棒动态重构[J].中国电机工程学报,2018,38(16):4715-47254976. 1.摘要 间歇性分布式电源并网使得配电网网络重构过程需要考虑更多的不确定因素。在利用仿射数对分布式电源出力的不确定性进行合…...
蓝桥杯第八届c++大学B组详解
目录 1.购物单 2.等差素数列 3.承压计算 4.方格分割 5.日期问题 6.包子凑数 7.全球变暖 8.k倍区间 1.购物单 题目解析:就是将折扣字符串转化为数字,进行相加求和。 #include<iostream> #include<string> #include<cmath> usin…...
小于n的最大数 Leetcode 902 Numbers At Most N Given Digit Set
这两个问题的本质就是一个棵树,然后根据n对树做剪枝。难点在于剪的时候边界条件有些坑,get_lower_largest_digit_dic是这两个题目的共同点 题目一: 小于n的最大数 算法题目:小于n的最大数 问题描述:给一个数组nums[5…...
Leetcode刷题-数组(二分法、双指针法、窗口滑动)
数组 1、二分法 704. 二分查找 - 力扣(LeetCode) 需要注意区间的问题。首先在最外面的循环判断条件是left<right。那就说明我们区间规定的范围就是【left,right】 属于是左闭右闭!!!!!&…...
STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (b)
继续上篇博文:STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (a)-CSDN博客 往下写, 为什么:当GPIO_InitStructure.GPIO_PinGPIO_Pin_0 ; 时,其实就是将对应的该引脚的寄存器地…...
wordpress主题域名限制破解/百度搜索关键词规则
CPU中央处理单元包含基本的运算单元AUL,存储单元cache等基本资源,实现硬件设备的基本控制功能。中央处理器作为一个普世概念,实际根据具体数据处理功能方向不同,细分位DSP、MCU和MP。其中DSP主要是做数据处理,MCU做无系…...
怀柔做网站的公司/今日头条新闻军事
n个串长度为m 然后n个串 问可以最少移动多少次 然后是密码中有数字 字母 然后其他的 都至少一个 光标最初在左边 可以直接往右移到最后一个 处理出每行到数字 字母 其他的最小移动数目 然后暴力 列举 数字 字母 其他 出现的行 #include<stdio.h> #include<algorithm…...
广州网站建设o2o/万网域名查询注册商
信号调制与解调[实验目的]1. 了解用MATLAB 实现信号调制与解调的方法。 2. 了解几种基本的调制方法。 [实验原理]由于从消息变换过来的原始信号具有频率较低的频谱分量,这种信号在许多信道中不适宜传输。因此,在通信系统的发送端通…...
中企动力做网站的优势/网站快速排名公司
在Android编程的过程中,如果在Activity中某个操作会运行比较长的时间,比如:下载文件。这个时候如果在主线程中直接下载文件,会造成Activity卡死的现象;而且如果时间超过5秒,会有ANR报错。在这种情况下&…...
卖货到海外的免费平台/小时seo
1 传统API2 简化API 3 点对点 传统 4 发布订阅传统传统API简化API点对点域特定API发布订阅域特定APIConnection FactoryConnection FactoryQueueConnection FactoryTopicConnection FactoryConnectionJMSContextQueueConnectionTopicConnectionSessionJMSContextQueueSessionTo…...
建设网站销售/推广网站公司
我用来绕过“完整路径和文件名”长度限制以移动,复制或删除某些内容的一个技巧是,通过使用指向文件夹的映射驱动器号 “中途”(或更多)“ 插入 ”来缩短它顺路。所以你有c:\ some \ long \ path ... \ and \ foo \ bar \ folders \ oldfiles …...