【发布时间】:2016-12-26 07:32:12
【问题描述】:
我正在关注这个link 并尝试创建一个单例类。但是,考虑参数(在启动类时传递),如果参数相同,则返回相同的对象。
因此,我不想将类名/类引用存储为dict 键,而是将传递的参数作为键存储在dict 中。但是,也可能存在不可散列的参数(如dict、set 本身)。
存储类参数和类对象映射的最佳方式是什么?这样我就可以返回一个与参数对应的对象。
还是谢谢。
EDIT-1: 多一点解释。假设有如下类
class A:
__metaclass__ == Singleton
def __init__(arg1, arg2):
pass
现在,A(1,2) 应该总是返回相同的对象。但是,它应该不同于A(3,4)
我认为,参数在很大程度上定义了类的功能。假设班级是否要建立redis 连接。我可能想创建 2 个以 diff redis hosts 作为参数的单例对象,但底层的类/代码可能很常见。
【问题讨论】:
-
如果有
frozendict就好了,因为有frozenset...。我的意思是至少有一个实现,但它不在标准库中。无论如何,如果你不介意依赖,试试这个:pypi.python.org/pypi/frozendict -
也许我错了,但在我看来,您实际上希望记忆相同的类实例,例如
int('1') is int('1'),计算结果为True。对我来说,单例意味着该类只有一个实例,例如Noneobejct,它是NoneType的唯一实例。 -
好吧,我仍然认为这不再是单例模式,但没关系。假设你有
l1 = [1, 2]和l2 = [1, 2],所以l1 is l2是False和l1 == l2是True。你想让A(l1, 'foo')返回与A(l2, 'foo')相同的实例吗?当一个不可散列的参数改变时,A的单例实例会发生什么,例如由A(...)的调用者@ -
是的,在
l1 = [1, 2]和l2 = [1, 2]的情况下,我希望A(l1, 'foo')返回与A(l2, 'foo')相同的实例,因为即使对象可能不同,基础值也是相同的。如果更改了不可散列的参数,则假设它是经过深思熟虑的并且需要单独的实例。 -
好的,我会发布答案。
标签: python dictionary arguments singleton hashable