FastAPI 深入学习:利用__call__方法实现动态依赖项

news2024/11/15 11:02:43

在这里插入图片描述

在Python中,__init____call__ 是两个特殊的方法,它们在类的上下文中有特定的用途:

  1. __init__ 方法:

    • 这是类的初始化方法,当一个实例被创建时,它会被自动调用。
    • 它通常用于接收初始化参数并设置实例的初始状态。
    • 在你的示例中,FixedContentQueryChecker 类的 __init__ 方法接收一个参数 fixed_content,并将其存储在实例变量 self.fixed_content 中。这个变量随后可以在类的其他方法中使用。
  2. __call__ 方法:

    • 当一个实例被用作函数时,__call__ 方法会被自动调用。
    • 这意味着如果你有一个类的实例,并且你像调用函数一样调用这个实例(即 instance()),Python 会寻找并执行 __call__ 方法。
    • 在你的示例中,__call__ 方法定义了 FixedContentQueryChecker 类的行为,使其可以像函数一样被调用。它接收一个参数 q,这是一个字符串,默认为空字符串。方法内部检查 self.fixed_content 是否为 q 的子串,如果是,则返回 True,否则返回 False
from typing import Annotated

from fastapi import Depends, FastAPI

app = FastAPI()

class FixedContentQueryChecker:
    def __init__(self, fixed_content: str):
        self.fixed_content = fixed_content

    def __call__(self, q: str = ""):
        if q:
            return self.fixed_content in q
        return False

checker = FixedContentQueryChecker("bar")

@app.get("/query-checker/")
async def read_query_check(fixed_content_included: Annotated[bool, Depends(checker)]):
    return {"fixed_content_in_query": fixed_content_included}

在你的FastAPI应用示例中,FixedContentQueryChecker 类被用作一个依赖项,它检查查询参数中是否包含特定的固定内容。这里是详细步骤:

  • FixedContentQueryChecker 类被实例化为 checker,初始化时传入了字符串 "bar"
  • 在FastAPI路由装饰器 @app.get("/query-checker/") 下,定义了一个异步视图函数 read_query_check
  • 这个视图函数使用了一个依赖项 Annotated[bool, Depends(checker)],它告诉FastAPI在调用视图函数之前,先调用 checker 实例(即调用它的 __call__ 方法)。
  • 依赖项的参数 q 默认为空字符串,但FastAPI会将查询参数 q 的值传递给 checker 实例。
  • checker 实例的 __call__ 方法检查传递给它的查询参数 q 是否包含 "bar" 字符串,并将结果作为 fixed_content_included 参数传递给 read_query_check 视图函数。
  • 视图函数返回一个字典,包含一个键 fixed_content_in_query,其值是 checker 实例检查的结果。

这样,当用户发送GET请求到 /query-checker/ 并提供查询参数 q 时,FastAPI会调用 checker 实例来检查 q 是否包含 "bar",并将结果作为JSON响应返回。

补课:

在Python中,当你想让一个类的实例表现得像一个函数时,你可以在类定义中实现 __call__ 方法。这个方法在实例被调用(使用圆括号 ())时自动触发。这使得对象可以采用类似函数的调用方式。

下面是一个简单的例子,演示如何使用 __call__ 方法:

class Greeting:
    def __init__(self, name):
        self.name = name

    def __call__(self):
        return f"Hello, {self.name}!"

# 创建一个Greeting类的实例
greeter = Greeting("World")

# 调用这个实例,就像它是一个函数一样
print(greeter())  # 输出: Hello, World!

创建一个类的实例跟调用实例是不一样的。

在这个例子中,Greeting 类有一个 __init__ 方法来初始化实例,接收一个名字 name__call__ 方法则定义了当实例被调用时应该执行的操作,这里是返回一个问候语。

另一个例子:创建一个简单的计算器

让我们创建一个可以像函数一样调用的简单计算器类:

class Calculator:
    def __init__(self, a=0, b=0):
        self.a = a
        self.b = b

    def __call__(self, operation):
        if operation == "add":
            return self.a + self.b
        elif operation == "subtract":
            return self.a - self.b
        elif operation == "multiply":
            return self.a * self.b
        elif operation == "divide":
            if self.b != 0:
                return self.a / self.b
            else:
                return "Error: Division by zero"

# 创建一个Calculator实例
calc = Calculator(10, 5)

# 调用实例来执行加法
print(calc("add"))  # 输出: 15

# 调用实例来执行减法
print(calc("subtract"))  # 输出: 5

# 调用实例来执行乘法
print(calc("multiply"))  # 输出: 50

# 调用实例来执行除法
print(calc("divide"))  # 输出: 2.0

# 尝试除以零
print(calc("divide"))  # 输出: Error: Division by zero

在这个例子中,Calculator 类的 __call__ 方法接收一个操作参数 operation,根据传入的操作类型(加法、减法、乘法、除法),执行相应的运算。

通过实现 __call__ 方法,类的实例可以被直接调用,这使得它们在某些情况下非常有用,特别是在需要自定义函数对象或实现回调函数时。

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

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

相关文章

【828华为云征文|华为云Flexus X实例:一键助力中小企业,快速部署个性化网站!】

文章目录 前言搭建自己专属网站准备工作具体操作服务器环境确认进入宝塔软件商店JTBC网站内容管理系统一键部署填写域名放行80端口JTBC安装初始页数据库信息配置管理员信息配置完成安装网站管理后台网站前台 验证后台配置内容前台访问的效果 结语 前言 在云计算盛行的时代&…

宠物空气净化器哪个好?希喂、352、有哈宠物空气净化器测评分享

朋友在三个月前养了一只银渐层,从此进入了幸福的养猫生活,但她最近也跟我说,最近因为猫咪和她男朋友吵架了。 每天下班她男朋友回得都比她早,每次开门看到的就是猫咪的毛发掉得很多,地板上、沙发上甚至厨房里都能看到…

WebGL系列教程四(绘制彩色三角形)

目录 1 前言2 varying变量介绍3 开始绘制3.1 声明顶点着色器3.2 声明片元着色器3.3 创建顶点和颜色的缓冲区3.4 指定变量从缓冲区获取值3.5 效果3.6 varying的内涵3.7 完整代码 4 总结 1 前言 上一篇中我们介绍了如何使用缓冲区来绘制三角形,这一篇我们来讲讲如何给…

《PneumoLLM:利用大型语言模型的力量进行尘肺病诊断》|文献速递--基于深度学习的医学影像病灶分割

Title 题目 PneumoLLM: Harnessing the power of large language model for pneumoconiosis diagnosis 《PneumoLLM:利用大型语言模型的力量进行尘肺病诊断》 01 文献速递介绍 在计算机辅助诊断领域,对医学数据的处理和分析能力至关重要。这不仅有助…

【教师节视频制作】飞机降落飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】

教师节祝福视频制作教程飞机降落飞机机身AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 怎么如何做的【教师节视频制作】飞机降落飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤: 下载AE模板 安装AE软件 把AE模板导入AE软件 …

紫色UI趣味测试小程序源码,包含多种评测

紫色UI趣味测试小程序源码,包含多种评测。 该源码里面包含了多种评测,每一种评测都包含大多小细节。 代码下载

springboot网上租房系统---附源码79833

摘 要 如今,房屋作为人类生活的重要场所,在城市中扮演着至关重要的角色。随着城市化进程的加速和流动人口的增多,房屋租赁产业迎来了巨大的发展机遇。然而,在房屋租赁过程中存在着许多繁琐的手续和信息搜索的问题,需要…

抖音电商商品采集接口api 店铺商品列表sku返回值

如今,抖音已经成为国民最受欢迎的APP。因为抖音的存在,我们的生活开始变得更加有趣,同时,抖音带货,抖音duan等等呼之欲出,越来越多的人开始加入到抖音大战中去。在抖音进行带货或者进行短视频创作&#xff…

骨传导耳机哪个牌子值得买?推荐五款表现出色的骨传导耳机!

随着骨传导耳机技术的不断发展,市场呈现出多元化的趋势,但这也使得消费者在挑选时面临更多挑战,特别是如何避免因选择不当而引发的听力问题。目前市场上,部分由非专业厂商或网红快速推出的产品,因技术积累不足、材料选…

巅峰对决:南卡、韶音、墨觉旗舰级骨传导耳机深度评测与全面对比!

在如今的骨传导耳机市场,有许多新手小白想入手骨传导耳机,但是又非常怕自己踩雷。所以就疯狂在网上查攻略等等,也有很多小伙伴来询问我,在现在骨传导耳机市场上热门的南卡、韶音、墨觉哪款比较值得入手啊?那么今天&…

Unity Apple Vision Pro 开发(六):MR 物体交互

XR 开发者社区链接: SpatialXR社区:完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 课程分为上、中、下三个部分,上为公开部分,中和下仅社区可见,需要通过文章开头的链接加入社区。 【上】(理…

聚鼎科技:现在做装饰画是靠谱的吗

在生活的各个角落,艺术以多种形式存在着,而装饰画作为其中的一种,一直以其独特的魅力填充着我们的世界。但在这个快速变化的时代,许多人会问:现在做装饰画还是一个靠谱的选择吗? 装饰画的市场依旧充满生机。随着人们对…

docker 复制容器

在 Docker 中复制容器本身并不是直接支持的操作,但你可以通过以下方法来实现类似的效果: 1.将已有的容器提交为镜像 2.以该镜像创建容器 3.开启容器,进入容器内部 一. 使用 Docker 镜像复制容器 首先,你可以将容器的状态保存…

dropdown源码分析 -- ant-design-vue系列

组件结构 dropdown 组件对参数做了一些处理,然后直接调用了vc-trigger组件来进行渲染,先看一下整体的组件调用结构。 极简实现 这个组件需要满足以下几个基本的功能: 可以传入两个插槽 default 和 popup,default 是默认展示的节…

react js 处理表单( form )的2个例子

起因, 目的: 表单其实,有点复杂,因为涉及事件,event. 不熟悉的代码,还是尽量手写,不然的话,AI 生成的东西,自己看不懂。 例1 普通, 直接的方法 一个输入框&#xff0c…

微信小程序中数值计算的精度丢失问题

在微信小程序中,当你遇到数值计算的精度丢失问题时,主要是因为 JavaScript 在处理浮点数时存在固有的精度问题。这是因为计算机内部使用二进制形式存储数字,而某些十进制小数在二进制中无法精确表示,从而导致了精度误差。解决这个…

FastAPI 深度指南:使用依赖注入处理分页和过滤逻辑

在FastAPI框架中,Depends是一个关键的功能,它允许开发者通过依赖注入来管理和重用代码。这在处理API的分页和过滤逻辑时尤其有用,因为它可以将这些逻辑抽象化,从而减少冗余代码并提高效率。 通过Depends,我们可以定义…

优质设计素材网站推荐,助力创意设计

在设计工作中,优质的设计素材能够极大提升作品的质量和效率。无论是图标、插画、字体,还是配色方案,一个强大的素材库可以为设计师的创作提供无限的可能性。然而,面对互联网中海量的设计资源,找到适合自己需求的网站并…

Vue+SpringBoot+数据库整体开发流程 1

本篇文章通过springboot整合mybatis-plus去实现后端对数据库的增删改查,以及响应给前端的url,让前端获得数据。 目录 一、简单搭建一个Vue项目 检查node.js版本 使用vue-cli创建空项目 Vue-cli工程中每个文件夹和文件的用处 二、Mysql数据库 创建数…

全网最全的软件测试面试题(含文档)

1、你以前工作时的测试流程是什么? 参考答案:(灵活回答) 公司对测试流程没有规定如何做,但每个测试人员都有自己的一套测试流程。我说下我1年来不断改正(自己总结,吸取同行的方法)…