Python:基于参数的单例

2024-01-04

我正在关注这个link https://stackoverflow.com/a/6798042/820410并尝试创建一个单例类。但是,考虑参数(在启动类时传递),以便在参数相同时返回相同的对象。

因此,不要将类名/类引用存储为dictkey,我想将传递的参数存储为键dict。但是,也可能存在不可散列的论点(例如dict, set本身)。

存储类参数和类对象映射的最佳方式是什么?这样我就可以返回与参数对应的对象。

不管怎么说,多谢拉。


EDIT-1: 多一点解释。假设有一个类如下

class A:
    __metaclass__ == Singleton
    def __init__(arg1, arg2):
        pass

Now, A(1,2)应该总是返回相同的对象。但是,它应该不同于A(3,4)

我认为,这些论点很大程度上定义了类的功能。假设课程要进行redis连接。我可能想用 diff 创建 2 个单例对象redis主机作为参数,但底层类/代码可能是通用的。


正如 theheadofabroom 和我在评论中已经提到的那样,依赖不可散列值(例如缓存或记忆)时存在一些可能性。因此,如果您仍然想这样做,下面的示例不会将记忆隐藏在__new__ or __init__方法。 (自记忆类是危险的,因为记忆标准可能会被您无法控制的代码所欺骗)。

相反,我提供了这个功能memoize它返回一个类的记忆工厂函数。由于没有通用的方法来区分不可散列的参数,如果它们将产生相当于已经存在的实例的实例,则必须显式提供记忆化语义。这是通过通过keyfunc功能为memoize. keyfunc采用与类相同的参数'__init__方法并返回一个可散列的键,其相等关系(__eq__) 决定记忆。

记忆化的正确使用由使用代码负责(提供合理的keyfunc并使用工厂),因为要记忆的类没有被修改,仍然可以正常实例化。

def memoize(cls, keyfunc):
    memoized_instances = {}

    def factory(*args, **kwargs):
        key = keyfunc(*args, **kwargs)
        if key in memoized_instances:
            return memoized_instances[key]

        instance = cls(*args, **kwargs)
        memoized_instances[key] = instance
        return instance

    return factory


class MemoTest1(object):
    def __init__(self, value):
        self.value = value

factory1 = memoize(MemoTest1, lambda value : value)

class MemoTest2(MemoTest1):
    def __init__(self, value, foo):
        MemoTest1.__init__(self, value)
        self.foo = foo

factory2 = memoize(MemoTest2, lambda value, foo : (value, frozenset(foo)))

m11 = factory1('test')
m12 = factory1('test')
assert m11 is m12

m21 = factory2('test', [1, 2])

lst = [1, 2]
m22 = factory2('test', lst)

lst.append(3)
m23 = factory2('test', lst)

assert m21 is m22
assert m21 is not m23  

我只包括了MemoTest2作为一个子类MemoTest1表明使用常规类继承并不涉及任何魔法。

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

Python:基于参数的单例 的相关文章

  • 没有名为 crypto.cipher 的模块

    我现在正在尝试加密一段时间 我最近得到了这个基于 python 的密码器 名为PythonCrypter https github com jbertman PythonCrypter 我对 Python 相当陌生 当我尝试通过终端打开 C
  • Django 代理模型的继承和多态性

    我正在开发一个我没有启动的 Django 项目 我面临着一个问题遗产 我有一个大模型 在示例中简化 称为MyModel这应该代表不同种类的物品 的所有实例对象MyModel应该具有相同的字段 但方法的行为根据项目类型的不同而有很大差异 到目
  • Python 的键盘中断不会中止 Rust 函数 (PyO3)

    我有一个使用 PyO3 用 Rust 编写的 Python 库 它涉及一些昂贵的计算 单个函数调用最多需要 10 分钟 从 Python 调用时如何中止执行 Ctrl C 好像只有执行结束后才会处理 所以本质上没什么用 最小可重现示例 Ca
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • 使用 on_bad_lines 将 pandas.read_csv 中的无效行写入文件

    我有一个 CSV 文件 我正在使用 Python 来解析该文件 我发现文件中的某些行具有不同的列数 001 Snow Jon 19801201 002 Crom Jake 19920103 003 Wise Frank 19880303 l
  • 以编程方式停止Python脚本的执行? [复制]

    这个问题在这里已经有答案了 是否可以使用命令在任意行停止执行 python 脚本 Like some code quit quit at this point some more code that s not executed sys e
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • Pygame:有没有简单的方法可以找到按下的任何字母数字的字母/数字?

    我目前正在开发的游戏需要让人们以自己的名义在高分板上计时 我对如何处理按键有点熟悉 但我只处理过寻找特定的按键 有没有一种简单的方法可以按下任意键的字母 而不必执行以下操作 for event in pygame event get if
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 无法在 Python 3 中导入 cProfile

    我试图将 cProfile 模块导入 Python 3 3 0 但出现以下错误 Traceback most recent call last File
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • Scrapy:如何使用元在方法之间传递项目

    我是 scrapy 和 python 的新手 我试图将 parse quotes 中的项目 item author 传递给下一个解析方法 parse bio 我尝试了 request meta 和 response meta 方法 如 sc
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip

随机推荐

  • UIScrollView 如何更改框架而不更改边界? UIScrollView 是如何工作的?

    我理解框架和边界之间的区别 我认为 边界是视图的本地坐标系 而框架是超级视图 然而 对于滚动视图 我有点困惑 当我在 UIScrollView 中有一个 UIImageView 并将其放大时 似乎框架变大 宽度和高度 也会增加相应 UIIm
  • 在 google 地图中查找给定点 5 公里半径范围内的位置

    嘿 我只是想收集谷歌地图数据库中给定点 5 公里半径以下的位置 我会将它们存储在数据库中以供以后处理 这可以完成吗 谢谢 如何获取所需圆内点的经度和纬度 您可以使用地点搜索 http code google com intl fr apis
  • 有没有办法通过作业名称获取 Quartz 中的作业密钥

    现在我正在寻找在 Quartz 库中通过作业名称获取作业密钥的功能 我看到Scheduler有方法通过组名称获取作业密钥GroupMatcher
  • Android 中是否有 API 支持以编程方式进行电话会议?

    我想通过从我的应用程序中选择一些联系人来进行电话会议 可以吗 电话会议中的设备数量是否有限制 有没有 Android SDK 支持 任何版本都适合我吗 请提供一些意见 提前致谢 您无法使用智能手机管理会议 您需要一个可以为您完成此操作的中间
  • django 脆皮形式 内联表单

    我正在尝试采用脆形式和引导程序 并尽可能多地使用它们的功能 而不是一遍又一遍地发明一些东西 有没有一种方法可以像 django admin 表单那样使用 Cripy forms bootstrap 来实现内联表单功能 这是一个例子 clas
  • 如何在 Perl 中连接两个散列而不使用循环?

    如何在 Perl 中将哈希 a 附加到哈希 b 而不使用循环 如果您的意思是合并他们的数据 只需执行以下操作 c a b
  • 如何在Python中用单反斜杠替换双反斜杠? [复制]

    这个问题在这里已经有答案了 我有一根绳子 该字符串中有双反斜杠 我想用单反斜杠替换双反斜杠 以便可以正确解析 unicode 字符代码 Pdb p fetched page p style text align center align c
  • 在 Android Studio 中导入 Facebook 库:找不到属性“ANDROID_BUILD_SDK_VERSION”

    我想将库项目导入到我的应用程序中 但每当我尝试这样做时 Android Studio 都无法识别它 它还在 build gradle 中给了我错误 该库是 PagerSlidingTabStrip 以下是一些图片 到目前为止我已经尝试了三天
  • .NET StringBuilder 在前面添加一行

    我知道System Text StringBuilder在 NET中有一个AppendLine 方法 但是 我需要在 a 的开头预先附加一行StringBuilder 我知道你可以使用Insert 附加一个字符串 但我似乎无法用一行来做到这
  • @Scheduled 方法内部的 Spring @Async 方法调用

    我正在使用 Spring boot EnableScheduling and EnableAsync 我有一个注释为的方法 Scheduled 我还有几个方法 注释为 Async 现在我称这些为 Async中的方法 Scheduled方法并
  • 在Powershell中使用Import-CSV,忽略注释行

    我认为我一定错过了一些明显的东西 因为我正在尝试使用 Import CSV 导入已在文件顶部注释掉行 始终以 作为第一个字符开头 的 CSV 文件 因此文件看起来像这样 SpecialCSV Version 1 0 0 Table Head
  • R,dplyr:如果每组只有一个唯一的非 NA 元素,则按组折叠字符变量元素

    假设我有以下 data framedf患者家乡和一项任意临床指标 心率 id lt c rep 1 3 each 2 rep 4 3 pt hometown lt c Atlanta NA NA San Diego NA NA San Fr
  • 使用 AWS Glue 或 PySpark 过滤 DynamicFrame

    我的 AWS Glue 数据目录中有一个名为 mytable 的表 该表位于本地 Oracle 数据库连接 mydb 中 我想将生成的 DynamicFrame 过滤为仅 X DATETIME INSERT 列 时间戳 大于特定时间 在本例
  • 在 Spring Data REST+HATEOAS 中删除 REST 关联

    我想知道如何通过 REST 调用删除多对多关联 我能够创建记录并将它们关联起来 但不知道如何删除 我有一个 Spring Boot 项目 其中使用 REST 和 HATEOAS 来绕过服务和控制器并直接公开我的存储库 我有一个用户模型 域类
  • 简单的 Haskell 循环

    我刚刚开始学习 Haskell 但现在缺少循环令人无限沮丧 我弄清楚了如何为函数编写循环 然而 我的问题是我想在迭代循环时输出一些结果 看来我必须使用调试来执行这个简单的任务 所以现在我只想看一个如何在主结构中打印 10 次字符串的示例 换
  • 使用VBA代码将表格从Excel复制到Word书签

    我实际上需要你帮助修改这个宏代码 我从其他地方得到了这个代码 抱歉 忘记了他的名字 基本上 我有来自 Excel Sheet1 的表数据源 我需要将该表传输到 MS Word 同时保留边框 字体大小 自动调整等格式 并使用名为 书签 的书签
  • ASP.NET 类库未遇到断点

    我有一个使用 vs2008 的 ASP NET Web 应用程序 它曾经让我达到断点 但由于本网站中的某些未知原因 它不再让我达到断点 我已经将所有内容设置为调试和重新构建大约一百万次以及其他所有内容 但似乎无法达到该死的断点 断点适用于该
  • #include 运行 pip install zbar 时生成 1 个错误

    我正在尝试奔跑pip install zbar由于某种原因 我似乎无法找到解决此依赖性问题的答案 任何帮助将不胜感激 请参阅下面的回溯 Downloading unpacking zbar Downloading zbar 0 10 tar
  • UIWebView:如何在 HTML 文本字段中插入文本

    I ve an UIWeb视图加载移动网络表单 URL 的位置 在我的应用程序的方法中 我想将一些文本插入具有焦点的 UIWebView 中的 HTML 文本字段中 我怎样才能做到这一点 有没有办法获取具有焦点的 HTML 元素的 ID 然
  • Python:基于参数的单例

    我正在关注这个link https stackoverflow com a 6798042 820410并尝试创建一个单例类 但是 考虑参数 在启动类时传递 以便在参数相同时返回相同的对象 因此 不要将类名 类引用存储为dictkey 我想