Python中的“泛型”和“多重继承”

“泛型”和“多重继承”属于 Python 的语法规则。


1. 泛型(Generic[T])

通俗解释

  • 泛型允许你在定义类或函数时,不指定具体的类型,而是使用一个“占位符”(通常命名为 T)。
  • 这就像你制作一个盒子,但盒子里可以放任何东西,只要这个东西符合某个约束条件(例如必须是某个类的实例)。
  • 在使用这个类或函数的时候,你可以确定它返回的对象类型和传入的类型是一致的(这里说一致只是建议一致,因为这种检查主要是通过静态类型检查工具完成的,Python 在运行时不会自动强制这一点。),从而让代码更加安全、清晰。

数值举例说明

假设你定义了一个泛型类,它能包装任意数字(整数或浮点数),并且保证返回的值与输入的类型一致:

from typing import Generic, TypeVar# 定义一个类型变量 T,表示“数字”的类型(这里没有特别限制,但可以加约束)
T = TypeVar("T", int, float)class NumberBox(Generic[T]):def __init__(self, value: T):self.value = valuedef double(self) -> T:# 返回输入数字的两倍return self.value * 2# 创建一个包装整数的 NumberBox
int_box = NumberBox(5)
print(int_box.double())  # 输出 10# 创建一个包装浮点数的 NumberBox
float_box = NumberBox(3.5)
print(float_box.double())  # 输出 7.0

说明:

  • 当你用整数(如 5)创建 NumberBox 时,T 自动被推导为 int,所以 double() 方法返回整数 10。
  • 当你用浮点数(如 3.5)创建 NumberBox 时,T 自动被推导为 float,返回 7.0。
  • 泛型保证了无论你用哪种数字,方法返回的类型都和你包装时的一致。

泛型是 Python 中类型提示的一部分,主要通过 typing 模块中的 GenericTypeVar 实现。它们是 Python 的语法规则之一,特别在静态类型检查工具(如 mypy)中发挥作用。


2. 多重继承

通俗解释

  • 多重继承允许一个类同时继承自多个父类,从而同时获得各个父类的属性和方法。
  • 这就像一个孩子可以同时继承爸爸的优点和妈妈的特点,而不必只选择一个来源。

数值举例说明

假设你有两个类,一个负责存储数据格式验证,一个负责日志记录:

class DataValidator:def validate(self, data):# 简单验证,假设数据必须大于 0if data > 0:return Truereturn Falseclass Logger:def log(self, message):print(f"Log: {message}")# 多重继承:同时继承 DataValidator 和 Logger
class DataProcessor(DataValidator, Logger):def process(self, data):if self.validate(data):self.log(f"Processing data: {data}")return data * 2else:self.log("Invalid data!")return None# 使用示例
processor = DataProcessor()
result = processor.process(10)  # 有效数据
print(result)  # 输出 20result = processor.process(-5)  # 无效数据
print(result)  # 输出 None

说明:

  • DataProcessor 同时继承了 DataValidator(数据验证)和 Logger(日志记录),因此它可以同时调用 validate()log() 方法。
  • 数值例子中,我们处理数字 10 和 -5,前者经过验证后返回 20,而后者因为验证失败返回 None

多重继承是 Python 的核心语法之一。Python 允许一个类在定义时写上多个父类,比如 class MyClass(A, B, C):。这使得你可以组合多个类的功能,但也需要注意方法解析顺序(MRO)的问题。


总结

  • 泛型(Generic[T])

    • 让类或函数在使用时保持类型一致性(例如上面 NumberBox 的例子)。
    • 属于 Python 类型提示系统的一部分,是 Python 的语法规则之一。
  • 多重继承

    • 允许一个类同时继承多个父类,从而获得多方面的功能(例如 DataProcessor 同时继承 DataValidator 和 Logger)。
    • 是 Python 核心语法的一部分,也是 Python 中常用的面向对象编程特性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/73673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pandas学习笔记(一)——基础知识和应用案例

pandas学习笔记 基础语法参考菜鸟教程:https://www.runoob.com/pandas/pandas-tutorial.html # jupyter import pandas as pd import matplotlib from matplotlib import pyplot as plt import numpy as npmatplotlib.use(TkAgg)data {timestamp: [1, 2, 3, 4, 5…

海绵音乐 3.4.0 | 免费AI音乐创作软件,支持多种风格智能生成

海绵音乐是一款专为Android用户设计的免费AI音乐创作软件,搭载深度神经网络作曲引擎,支持流行、电子、古风等12种音乐风格智能生成。提供多轨道编辑界面(8轨同步混音),可自定义鼓点、旋律和和弦进行实时混音&#xff0…

2025 香港 Web3 嘉年华:全球 Web3 生态的年度盛会

自 2023 年首届香港 Web3 嘉年华成功举办以来,这一盛会已成为全球 Web3 领域规模最大、影响力最深远的行业活动之一。2025 年 4 月 6 日至 9 日,第三届香港 Web3 嘉年华将在香港盛大举行。本届活动由万向区块链实验室与 HashKey Group 联合主办、W3ME 承…

【Dify平台】Function Call 模式模式和ReAct模型有什么不同?

本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 1. DIFY 平台的 Function Call 模式 2. ReAct…

解决 React Native 0.76 中 com.facebook.react.settings 插件缺失问题

在使用 React Native 0.76 创建项目时,遇到以下错误: FAILURE: Build failed with an exception. * Where: Settings file /Users/wangxp/learn/AwesomeProject/android/settings.gradle line: 2 * What went wrong: Plugin [id: com.facebook.react.se…

Linux目录结构以及文件操作

Linux目录结构以及文件操作 ubuntu属于Linux的发行版,带图形界面。但是跑在嵌入式设备中的Linux操作系统往往不带图形界面,直接使用命令来操作。Linux区分大小写。 在Linux系统上,文件被看作字节序列。 普通文件(—&#xff09…

React19源码系列之FiberRoot节点和Fiber节点

在上一篇文章,看了createRoot函数的大致流程。 createContainer函数创建并返回了FiberRoot 。FiberRoot是由createFiberRoot函数创建, createFiberRoot函数还将 FiberRoot和 根Fiber 通过current属性建立起了联系。将FiberRoot作为参数传给 ReactDOMRoo…

vue3+antd+a-menu配置

antd是用的3版本 <a-menu v-model:selectedKeys"selectedKeys" mode"inline" click"toPage"><template v-for"i in menus"><a-menu-item v-if"!i.children" :key"i.path"><span>{{ i.nam…

【2025年3月最新】Cities_Skylines:城市天际线1全DLC解锁下载与教程

亲测2025年3月11日能用&#xff0c;能解锁全部DLC 使用教程 点击下载 点击下载

基于Django的交通指示图像识别分析系统

【Django】基于Django的交通指示图像识别分析系统 &#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 本项目旨在通过大量交通标志数据训练后&#xff0c;得到较好的识别模型&#xff0c;便于用户…

SAP HANA on AWS Amazon Web Services

SAP HANA on AWS Amazon Web Services

【设计模式】】工厂模式

三、工厂模式 3.1 工厂模式 创建一个类对象的传统方式是使用关键字new, 因为用new 创建的类对象是一个堆对象&#xff0c;可以实现多态。工厂模式通过把创建对象的代码包装起来&#xff0c;实现创建对象的代码与具体 的业务逻辑代码相隔离的目的(将对象的创建和使用进行解耦)…

单片机外设快速入门篇(五)——GPIO篇

文章目录 一、GPIO输入模式​二.GPIO输出模式三.GPIO配置步骤 一、GPIO输入模式 ​1. 浮空输入&#xff08;Floating Input&#xff09;​ ​原理&#xff1a;引脚电平完全由外部电路决定&#xff0c;无内部上拉或下拉电阻。 ​特点&#xff1a; 悬空时电平不确定&#xff08;…

Python递归与递推的练习(初步了解复杂度,全排列的价值,奇妙的变换,数正方形,高塔登顶方案)

一.了解复杂度 1.1 为什么要考虑复杂度 在比赛中&#xff0c;编程题会有时间和空间的限制&#xff0c;所以我们需要根据时间复杂度和空间复杂度来判断用什么样的算法。 在本章中递归的时间复杂度比递推慢好多所有我们在写代码时对递归和递推的选择中应该尽量考虑递推。 复杂度…

解决分布式事务的方案 —— Seata

解决分布式事务的方案 —— Seata 1. 认识 Seata 解决分布式事务的方案有很多&#xff0c;但实现起来都比较复杂&#xff0c;因此我们一般会使用开源的框架来解决分布式事务问题。在众多的开源分布式事务框架中&#xff0c;功能最完善、使用最多的就是阿里巴巴在 2019 年开源…

Antd实现上传下载csv文件

1 上传 解析csv文件&#xff1a; import { parse } from papaparse;export function parseCSV(file: File): Promise<string[][]> {return new Promise((resolve, reject) > {const reader new FileReader();reader.onload () > {const csvData reader.result…

Asp.net Core API 本地化

本文是一个demo&#xff0c;演示了如何根据用户接口查询字段(正常放header中),设置当前culture&#xff0c;并获取当前culture的key value给用户提示 创建Resources文件夹&#xff0c;添加以下三个文件 其中ExceptionUnuse 是一个空的类&#xff0c;供IStringLocalizer使用&a…

MambaVision:一种Mamba-Transformer混合视觉骨干网络

摘要 我们提出了一种新型混合Mamba-Transformer主干网络&#xff0c;称为MambaVision&#xff0c;该网络专为视觉应用而设计。我们的核心贡献包括重新设计Mamba公式&#xff0c;以增强其对视觉特征的高效建模能力。此外&#xff0c;我们还对将视觉Transformer&#xff08;ViT&…

{瞎掰} 手机安装app问题:app签名,手机 or OS官方商店 其他非官方app源,安全防护 突破限制

以下&#xff0c;在华为安卓系统手机中&#xff0c;在安装app过程中得到的一些可能是错误的经验。 商品化 app 的收钱方式&#xff1a;通过商店来收钱&#xff0c;通过 app 本身提供的注册码功能来收钱&#xff0c;或是其他的收钱方式。 手机安装 app的特点 从官方商店里安装…

【数据库】Data Model(数据模型)数据模型分析

理解图片中的 Data Model&#xff08;数据模型&#xff09;是学习数据库设计和应用程序开发的重要一步。作为初学者&#xff0c;你可以通过比喻和简单的解释来理解这些概念以及它们之间的联系。以下是对图片中数据模型的详细分析&#xff0c;以及如何理解它们之间的关系。 1. 数…