Python 中有依赖注入容器吗?

2024-01-03

一直在摆弄 python,像往常一样,它让我严格的静态类型面向对象世界变得有点混乱。 Python 支持鸭子类型,没有基于接口的编程的可用概念(如 C# 接口)并允许全局变量。有了所有这些好处,依赖注入容器真的有任何意义吗?或者 Python 运行时是否会成为容器。

我理解静态类型 OO 语言(例如 Java 和 C#)中这些容器的意义,但是这样的东西如何适合 Python 的疯狂世界(我喜欢它)?

我一直怀疑依赖注入作为一种设计模式是一种难闻的气味,一切事物都必须是 C# 和 Java 的“纳粹思维”类,我是正确的还是有什么我遗漏的?

到目前为止,我认为我可以通过使用全局来涵盖工厂、单例、多实例对象。我还怀疑 Aspect 的内容也被涵盖了,尽管我仍在考虑这一点。

Duck Typing 是目前让我着迷的东西,所以习惯于定义接口,然后在这些接口上建立类,并让静态的东西掩盖我的愚蠢,我觉得没有静态类型,容器有点无用。

edit

我想在使用 python 时我不会使用依赖注入框架/容器。确实没有任何意义。在思考和阅读了迄今为止的回复之后,我们的论点已经很清楚了,如果没有静态类型定义,所做的承诺是如此松散,为什么还要费心呢。鸭子类型就是这样,唯一的承诺可以通过文档做出。只要引用通过签名参数进入类方法/函数,而不是通过编程环境的以太,那么我想我就会安全。

但令人担忧的是,我无法像在 Java 和 C# 中那样通过过度设计实践将自己的意愿强加于他人。我在乎吗……不:)


没有基于接口的编程的可用概念(如 C# 接口)

仅仅因为编译器无法检查您是否正确使用接口并不意味着“没有可用的接口概念”。您记录接口并编写单元测试。

至于全局变量,它不是这样的public staticC# 或 Java 类上的方法和字段确实有所不同。例如,考虑 java.lang.Math 的工作原理。现在考虑 java.lang.Mathisn't一个单例。他们这样做是有充分理由的。

有了所有这些好处,依赖注入容器真的有什么意义吗?

我对此表示怀疑,但我也从未真正看到它们在 C# 或 Java 中的意义。依赖注入是一种编程技术, 在我看来。而且实际上也没有那么多。

我一直怀疑依赖注入作为一种设计模式是一种恶臭,一切事物所创造的一定是一类“纳粹思维”

不,不是。很多时候依赖注入是一个好主意。您也不需要一个类来注入依赖项。每次您将某些内容作为参数传递给自由函数时,而不是让该函数调用另一个函数来获取信息,您基本上都在做同样的事情:控制反转。 Python 还允许您在很多方面将模块视为类(当然比 Java 和 C# 的方式更多)。有些问题可以通过将模块作为参数传递给函数来解决。 :)

到目前为止,我认为我可以通过使用全局来涵盖工厂、单例、多实例对象。

如果有的话,单身人士就是难闻的气味。根据我丰富的经验,几乎在每种情况下,它们的存在都是因为有人认为原则上拥有全局是不好的,没有真正考虑可能的选项,或者为什么他们想要对单个共享对象进行这种访问,或者甚至是为什么全局变量从一开始就是“Bad(TM)”。

You could在 Python 中创建一个充当工厂的全局函数。然而,我想说,执行以下任何操作都更Pythonic:

a)首先,真的,真的,really当然你不能只做你想做的事__init__。我的意思是,在动态类型语言中,您可以通过这种方式做很多事情。

b) If __init__不会削减它,尝试使用__new__来控制行为。

在Python中,类本身就是对象,是可调用的。默认情况下,调用它们会实例化该类。和__new__,你可以加入其中。

c) 使用应用于类的装饰器。这是一个创建单例的示例(只是因为):

def _singleton(cls):
  instance = cls()
  result = lambda: instance
  result.__doc__ = cls.__doc__
  return result

@_singleton
class example(object): pass

其工作原理是:当你装饰班级时,_singleton()被调用,并传入类。实例被构造并缓存,并且_singleton()返回一个匿名函数,该函数在调用时将返回实例。为了完成这个谜题,类的文档被附加到匿名函数上。然后Python将全局范围内的类名重新绑定到返回的匿名函数。因此,当您调用它时,每次都会获得该类的相同实例。

当然,现在这仍然可以解决(你可以做类似的事情)example().__class__()获取另一个实例),但与简单地忽略工厂函数以正常使用构造函数相比,您做错了什么更明显。另外,这意味着调用代码实际上就像正常调用构造函数一样:)

Duck Typing 是目前让我着迷的东西,所以习惯于定义接口,然后在这些接口上建立类,并让静态的东西掩盖我的愚蠢,我觉得没有静态类型,容器有点无用。

你需要转变你的想法:停止担心你已经通过的事情is,并担心它是否可以做你想让它做的事。这就是鸭子打字的工作原理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中有依赖注入容器吗? 的相关文章

  • 在 Python 中解析 TCL 列表

    我需要在双括号上拆分以空格分隔的 TCL 列表 例如 OUTPUT 172 25 50 10 01 01 Ethernet 172 25 50 10 01 02 Ethernet Traffic Item 1 172 25 50 10 01
  • 在 Python 中将列表元素作为单独的项目返回

    Stackoverflow 的朋友们大家好 我有一个计算列表的函数 我想单独返回列表的每个元素 如下所示 接收此返回的函数旨在处理未定义数量的参数 def foo my list 1 2 3 4 return 1 2 3 4 列表中的元素数
  • matplotlib 图中点的标签

    所以这是一个关于已发布的解决方案的问题 我试图在我拥有的 matplotlib 散点图中的点上放置一些数据标签 我试图在这里模仿解决方案 是否有与 MATLAB 的 datacursormode 等效的 matplotlib https s
  • VSCode Settings.json 丢失

    我正在遵循教程 并尝试将 vscode 指向我为 Scrapy 设置的虚拟工作区 但是当我在 VSCode 中打开设置时 工作区设置 选项卡不在 用户设置 选项卡旁边 我还尝试通过以下方式手动转到文件 APPDATA Code User s
  • 如何从Python中的函数返回多个值? [复制]

    这个问题在这里已经有答案了 如何从Python中的函数返回多个变量 您可以用逗号分隔要返回的值 def get name you code return first name last name 逗号表示它是一个元组 因此您可以用括号将值括
  • 使用主题交换运行多个 Celery 任务

    我正在用 Celery 替换一些自制代码 但很难复制当前的行为 我期望的行为如下 创建新用户时 应向tasks与交换user created路由键 该消息应该触发两个 Celery 任务 即send user activate email
  • 为什么 web2py 在启动时崩溃?

    我正在尝试让 web2py 在 Ubuntu 机器上运行 所有文档似乎都表明要在 nix 系统上运行它 您需要下载源代码并执行以下操作 蟒蛇 web2py py 我抓住了source http www web2py com examples
  • PyQt 使用 ctrl+Enter 触发按钮

    我正在尝试在我的应用程序中触发 确定 按钮 我当前尝试的代码是这样的 self okPushButton setShortcut ctrl Enter 然而 它不起作用 这是有道理的 我尝试查找一些按键序列here http ftp ics
  • 打印数字时添加千位分隔符[重复]

    这个问题在这里已经有答案了 我真的不知道这个问题的 名称 所以它可能是一个不正确的标题 但问题很简单 如果我有一个数字 例如 number 23543 second 68471243 我想要它使print 像这样 23 54368 471
  • 打印包含字符串和其他 2 个变量的变量

    var a 8 var b 3 var c hello my name is var a and var b bye print var c 当我运行程序时 var c 会像这样打印出来 hello my name is 8 and 3 b
  • Python 内置的 super() 是否违反了 DRY?

    显然这是有原因的 但我没有足够的经验来认识到这一点 这是Python中给出的例子docs http docs python org 2 library functions html super class C B def method se
  • 通过Python连接到Bigquery:ProjectId和DatasetId必须非空

    我编写了以下脚本来通过 SDK 将 Big Query 连接到 Python 如下所示 from google cloud import bigquery client bigquery Client project My First Pr
  • pandas - 包含时间序列数据的堆积条形图

    我正在尝试使用时间序列数据在 pandas 中创建堆积条形图 DATE TYPE VOL 0 2010 01 01 Heavy 932 612903 1 2010 01 01 Light 370 612903 2 2010 01 01 Me
  • Pandas 组合不同索引的数据帧

    我有两个数据框df 1 and df 2具有不同的索引和列 但是 有一些索引和列重叠 我创建了一个数据框df索引和列的并集 因此不存在重复的索引或列 我想填写数据框df通过以下方式 for x in df index for y in df
  • Python:Goslate 翻译请求返回“503:服务不可用”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们不允许提出寻求书籍 工具 软件库等推荐的问题 您可以编辑问题 以便用事实和引文来回答 这个问题似乎不是关于主要由程序员使用的特定编程问
  • 如何以正确的方式为独立的Python应用程序制作setup.py?

    我读过几个类似的主题 但还没有成功 我觉得我错过或误解了一些基本的事情 这就是我失败的原因 我有一个用 python 编写的 应用程序 我想在标准 setup py 的帮助下进行部署 由于功能复杂 它由不同的 python 模块组成 但单独
  • 制作一份 Python 文档的 PDF 文件

    Python 官方网站提供 PDF 文档下载 但它们是按章节分隔的 我下载了源代码并构建了 PDF 文档 这些文档也是单独的 PDF 我怎么能够从源代码中的 Makefile 构建一个 PDF 文件 我认为这样阅读起来会更方便 如果连接单独
  • 根据 Pandas 中的列表选择数据框行的子集

    我有一个数据框df1并列出x In 22 import pandas as pd In 23 df1 pd DataFrame C range 5 B range 10 20 2 A list abcde In 24 df1 Out 24
  • python 对浮点数进行不正确的舍入

    gt gt gt a 0 3135 gt gt gt print 3f a 0 314 gt gt gt a 0 3125 gt gt gt print 3f a 0 312 gt gt gt 我期待 0 313 而不是 0 312 有没有
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS

随机推荐

  • 函数调用缺少参数列表来创建指针

    我尝试通过 VRPN 服务器将我的应用程序连接到 OpenViBE 我的应用程序运行良好 直到我尝试添加代码以将我的应用程序连接到 VRPN 服务器 我的代码如下所示 MainWindow c code include mainwindow
  • 是否可以将两种语言代码文件(即 C# 和 VB.NET)添加到 App_Code 中?如果是这样,我怎样才能实现这一目标?

    在将两个语言代码文件 即 C 和 VB NET 添加到 App Code 时 出现错误 The files file names use a different language which is not allowed since the
  • 如何根据鼠标位置改变光标?

    我想将光标从default to pointer当鼠标进入矩形 50 50 100 100 时body元素 数字以像素为单位 我知道我可以定义一个div 将其放置在该位置 并设置cursor pointer 就它而言 但我正在寻找某种方法而
  • Angular Material Table 拥有带有过滤方法的数据源

    借助这个tutorial https codingthesmartway com angular material part 4 data table 我为角度材料表编写了自己的数据源 我从 api 获取数据列表并将其显示在材料表中 代码我
  • pandas:当索引不唯一时使用 diff 和 groupby 时出现问题

    我在用pandas questions tagged pandas 版本0 20 3 并且我想应用diff 方法与groupby 但结果不是 DataFrame 而是 下划线 这是代码 import numpy as np import p
  • 将数据框中的所有日期更改为标准日期时间

    我有一个带有日期列的数据框 它看起来像这样 有多个日期列 例如结束日期 会计年度日期等 Plan Start Date 8 16 2017 0 00 5 31 2017 0 00 5 31 2017 0 00 5 31 2017 0 00
  • 添加容器视图 ID 为 0 的片段

    当我调用时android在哪里添加fragmentFragmentTransaction add Fragment fragment String tag 我已经编写了这段代码 但我看不到片段的布局 它显示一个空屏幕 Override pr
  • Highstock 中的双轴?

    有没有办法在 Highstock 中制作像 Highcharts 上的双轴一样的双轴 http www highcharts com demo combo dual axes http www highcharts com demo com
  • OpCache 不缓存

    我最近激活了 opcache 但它似乎不起作用 通过 phpinfo 确认已激活 如你看到的 0 次点击 1 次错过 1个缓存脚本 opcache gui 我缺少什么 服务器是Linux服务器centos 6 5 vps PHP 5 5 有
  • Emacs 口齿不清;如何从任何类型的变量创建字符串?

    就像错误调用函数的错误消息一样 例如 message file attributes 产生消息 eval Wrong type argument stringp home14 tjones 1 0 0 20415 35598 20211 1
  • setText 不适用于自定义编辑文本

    我正在使用从 github 找到的一个很好的材料设计编辑文本 https github com rengwuxian MaterialEditText https github com rengwuxian MaterialEditText
  • 设置 iPhone 键盘语言

    我希望当用户点击 UITextField 时 iPhone 虚拟键盘会显示为预设的特定语言 例如俄语 有没有办法在 Cocoa 代码中做到这一点 不幸的是 这是用户定义的设置 程序员不能弄乱
  • org.hibernate.AnnotationException:没有为使用 JPA XML 实体映射的实体指定标识符

    我现在使用 Hibernate 5 2 4 Final 从 5 2 3 升级 看看这是否可以修复错误 但仍然没有成功 我有以下 SQL CREATE TABLE Token tokenId BIGINT PRIMARY KEY uuid U
  • 如何导航到相同的父状态

    根据我对 Gmail 和 TED 应用程序的观察 向上导航的行为它将导航到具有相同状态 滚动位置 的父项 这与 Google 在其文档中所说的不同实施向上导航 http developer android com training impl
  • 函数参数中的元组解包

    在下面的函数中 args i 应该通过以下方式解压到函数 func 的参数中 然而在它之前传入的是一个列表 我缺少什么 def mymap func seq args list zip seq ret for i in range len
  • Django allauth - 设置 Facebook 重定向

    在我的应用程序中 我有一个 next 参数 因此当用户登录时 他们将被重定向到他们来自的地方 示例 www mysite com login next www mysite com some section 我在用Django allaut
  • 根据用户角色类型更改布局

    我是 MVC 新手 我浏览了堆栈上的类似帖子 但它们似乎对我的问题没有帮助 我有两个角色管理员和用户 当一个人登录时 我希望布局根据该人是否登录而改变Admin特权或User特权 My Admin布局是 Layout cshtml My U
  • 存储大量会话数据的最佳位置[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使用 HTML/CSS UI 构建原生 C++ 应用程序? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否可以在使用 HTML 和 CSS 作为用户界面的同时开发 C 程序 我了解如何使用 Webkit 容
  • Python 中有依赖注入容器吗?

    一直在摆弄 python 像往常一样 它让我严格的静态类型面向对象世界变得有点混乱 Python 支持鸭子类型 没有基于接口的编程的可用概念 如 C 接口 并允许全局变量 有了所有这些好处 依赖注入容器真的有任何意义吗 或者 Python