python - 某些属性唯一的 Python 类实例
问题描述
假设我想自由地创建我的类的实例,但是如果我用相同的参数进行实例化,我想获得代表该参数的相同的唯一实例。例如:
a = MyClass('Instance 1');
b = MyClass('Instance 2');
c = MyClass('Instance 1');
根据我传入的唯一标识符,我 想a == c
成为。True
笔记:
(1) 我不是在谈论操纵相等运算符——我a
真的想成为与c
.
(2) 这旨在作为库代码,因此必须强制执行唯一性——我们不能只指望用户做正确的事情(不管是什么)。
有没有实现这一目标的规范方法?我一直遇到这种模式,但我经常看到涉及影子类的解决方案,仅用于内部实例化。我想我有一个更清洁的解决方案,但它确实涉及 get() 方法,我想知道我是否可以做得更好。
解决方案
我会使用元类。此解决方案避免调用__init__()
太多次:
class CachedInstance(type):
_instances = {}
def __call__(cls, *args):
index = cls, args
if index not in cls._instances:
cls._instances[index] = super(CachedInstance, cls).__call__(*args)
return cls._instances[index]
class MyClass(metaclass=CachedInstance):
def __init__(self, name):
self.name = name
a = MyClass('Instance 1');
b = MyClass('Instance 2');
c = MyClass('Instance 1');
assert a is c
assert a is not b
推荐阅读
- php - 是否有技术原因不使用 try catch 来检索可能未设置的属性
- spacy - 使用自己的训练数据从头开始创建 NER 模型时使用的神经网络架构是什么
- angular - 如何在具有 Bootstrap 的 Angular 中正确格式化 FullCalendar?
- excel - 将匹配限制为三个而不是无限
- php - 在资源上进行任何更改时出现一些错误
- sql - 根据原始列之一中的值对一些数据进行分组
- java - 如何修复错误 org.testng.eclipse.maven.MavenTestNGLaunchConfigurationProvider.getClasspath(Lorg/eclipse/debug/core/ILaunchConfiguration;)
- anaconda - MacOS 上的 PythonNet:在执行本机代码时获得 SIGABRT
- java - 如何在 swagger 中定义自定义枚举值
- python-3.x - 在 python 3 中的两个非常大的元组列表中查找常见元组索引的最有效方法?