方法重载与类型注解(方法重载所涉及的方法)
off999 2024-10-28 16:49 31 浏览 0 评论
在 Python 中,方法重载是一个比较常见的需求,尤其当我们需要根据不同类型的参数执行不同的逻辑时。虽然 Python 本身并不支持传统意义上的方法重载,但我们可以通过类型注解、条件判断以及 @overload 装饰器来实现类似的功能。本文将通过一个简单的例子来演示如何处理不同参数类型的重载。
场景介绍
假设我们有一个操作处理器 ActionHandler?,该处理器根据不同的操作类型(如创建集群、扩展集群)来执行对应的逻辑。不同操作需要的参数并不相同,例如创建操作需要集群名称和节点列表,而扩展操作则需要集群 ID 和节点列表。
为了实现这一需求,我们可以通过 pydantic? 定义数据模型,并使用类型注解与 @overload? 来实现方法的重载。
代码解析
首先,我们定义了两个操作参数模型:CreateActionParams? 和 ExpandActionParams?,分别对应“创建”和“扩展”操作。每个模型都通过 Literal? 来指定 action? 字段的固定值,以确保操作类型的唯一性和准确性。
from typing_extensions import Literal
from pydantic import BaseModel
class CreateActionParams(BaseModel):
action: Literal["create"]
name: str
access_address: str
node_ids: list[int]
class ExpandActionParams(BaseModel):
action: Literal["expand"]
cluster_id: int
node_ids: list[int]
接下来,定义了一个通用的 Params? 类,它包含了两种操作类型中的一种。这个类帮助我们将不同类型的参数模型统一起来,以便传递给后续的逻辑处理。
class Params(BaseModel):
value: CreateActionParams | ExpandActionParams
方法重载
在 ActionHandler? 类中,我们希望根据传入的参数类型,自动调用不同的处理方法。例如,当参数为 CreateActionParams? 时,我们调用 _create? 方法;当参数为 ExpandActionParams? 时,则调用 _expand? 方法。
为此,我们使用了 @overload? 装饰器声明了不同参数类型的重载方法。实际的 run? 方法使用 isinstance? 来判断参数的类型,并调用对应的方法。
from typing import overload
class ActionHandler:
@overload
def run(self, params: CreateActionParams) -> None: ...
@overload
def run(self, params: ExpandActionParams) -> None: ...
def run(self, params: CreateActionParams | ExpandActionParams) -> None:
if isinstance(params, CreateActionParams):
return self._create(params)
elif isinstance(params, ExpandActionParams):
return self._expand(params)
else:
raise Exception("Action not supported")
def _create(self, params: CreateActionParams) -> None:
print(f"{params.action} cluster {params.name}, use nodes: {params.node_ids}")
def _expand(self, params: ExpandActionParams) -> None:
print(f"{params.action} cluster {params.cluster_id}, use nodes: {params.node_ids}")
使用示例
我们可以通过如下方式使用 ActionHandler? 来执行不同的操作。首先,我们定义了一个 action? 函数,该函数接收一个 Params? 对象,并将其传递给 ActionHandler? 的 run? 方法进行处理。
def action(params: Params) -> None:
ActionHandler().run(params.value)
最后,我们通过 pydantic? 的 model_validate? 方法将字典转换为 Params? 对象,并执行对应的逻辑:
if __name__ == "__main__":
params = {
"value": {
"action": "create",
"name": "test",
"access_address": "127.0.0.1",
"node_ids": [1, 2],
}
}
action(Params.model_validate(params))
params2 = {"value": {"action": "expand", "cluster_id": 1, "node_ids": [1, 2]}}
action(Params.model_validate(params2))
在运行这段代码时,系统会根据 action? 字段的值来判断应执行创建还是扩展操作。例如,action? 为 "create"? 时,输出为:
create cluster test, use nodes: [1, 2]
当 action? 为 "expand"? 时,输出为:
expand cluster 1, use nodes: [1, 2]
总结
通过使用 @overload? 和类型注解,我们能够在 Python 中实现类似方法重载的功能,从而根据不同类型的参数执行不同的逻辑。本文展示了如何结合 pydantic? 和 typing? 模块来实现这一需求。虽然 Python 不支持传统的重载机制,但通过合理的设计,我们仍然可以实现灵活的、类型安全的代码。
这种方式特别适合需要处理多种不同类型的输入、并且希望在编译时捕获潜在错误的场景。
?
相关推荐
- 阿里云国际站ECS:阿里云ECS如何提高网站的访问速度?
-
TG:@yunlaoda360引言:速度即体验,速度即业务在当今数字化的世界中,网站的访问速度已成为决定用户体验、用户留存乃至业务转化率的关键因素。页面加载每延迟一秒,都可能导致用户流失和收入损失。对...
- 高流量大并发Linux TCP性能调优_linux 高并发网络编程
-
其实主要是手里面的跑openvpn服务器。因为并没有明文禁p2p(哎……想想那么多流量好像不跑点p2p也跑不完),所以造成有的时候如果有比较多人跑BT的话,会造成VPN速度急剧下降。本文所面对的情况为...
- 性能测试100集(12)性能指标资源使用率
-
在性能测试中,资源使用率是评估系统硬件效率的关键指标,主要包括以下四类:#性能测试##性能压测策略##软件测试#1.CPU使用率定义:CPU处理任务的时间占比,计算公式为1-空闲时间/总...
- Linux 服务器常见的性能调优_linux高性能服务端编程
-
一、Linux服务器性能调优第一步——先搞懂“看什么”很多人刚接触Linux性能调优时,总想着直接改配置,其实第一步该是“看清楚问题”。就像医生看病要先听诊,调优前得先知道服务器“哪里...
- Nginx性能优化实战:手把手教你提升10倍性能!
-
关注△mikechen△,十余年BAT架构经验倾囊相授!Nginx是大型架构而核心,下面我重点详解Nginx性能@mikechen文章来源:mikechen.cc1.worker_processe...
- 高并发场景下,Spring Cloud Gateway如何抗住百万QPS?
-
关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。高并发场景下网关作为流量的入口非常重要,下面我重点详解SpringCloudGateway如何抗住百万性能@m...
- Kubernetes 高并发处理实战(可落地案例 + 源码)
-
目标场景:对外提供HTTPAPI的微服务在短时间内收到大量请求(例如每秒数千至数万RPS),要求系统可弹性扩容、限流降级、缓存减压、稳定运行并能自动恢复。总体思路(多层防护):边缘层:云LB...
- 高并发场景下,Nginx如何扛住千万级请求?
-
Nginx是大型架构的必备中间件,下面我重点详解Nginx如何实现高并发@mikechen文章来源:mikechen.cc事件驱动模型Nginx采用事件驱动模型,这是Nginx高并发性能的基石。传统...
- Spring Boot+Vue全栈开发实战,中文版高清PDF资源
-
SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序...
- Docker-基础操作_docker基础实战教程二
-
一、镜像1、从仓库获取镜像搜索镜像:dockersearchimage_name搜索结果过滤:是否官方:dockersearch--filter="is-offical=true...
- 你有空吗?跟我一起搭个服务器好不好?
-
来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。昨天闲的没事的时候,随手翻了翻写过的文章,发现一个很严重的问题。就是大多数时间我都在滔滔不绝的讲理论,却很少有涉及动手...
- 部署你自己的 SaaS_saas如何部署
-
部署你自己的VPNOpenVPN——功能齐全的开源VPN解决方案。(DigitalOcean教程)dockovpn.io—无状态OpenVPNdockerized服务器,不需要持久存储。...
- Docker Compose_dockercompose安装
-
DockerCompose概述DockerCompose是一个用来定义和管理多容器应用的工具,通过一个docker-compose.yml文件,用YAML格式描述服务、网络、卷等内容,...
- 京东T7架构师推出的电子版SpringBoot,从构建小系统到架构大系统
-
前言:Java的各种开发框架发展了很多年,影响了一代又一代的程序员,现在无论是程序员,还是架构师,使用这些开发框架都面临着两方面的挑战。一方面是要快速开发出系统,这就要求使用的开发框架尽量简单,无论...
- Kubernetes (k8s) 入门学习指南_k8s kubeproxy
-
Kubernetes(k8s)入门学习指南一、什么是Kubernetes?为什么需要它?Kubernetes(k8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。它...
欢迎 你 发表评论:
- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
