首页 > 解决方案 > 某些属性唯一的 Python 类实例

问题描述

假设我想自由地创建我的类的实例,但是如果我用相同的参数进行实例化,我想获得代表该参数的相同的唯一实例。例如:

a = MyClass('Instance 1');
b = MyClass('Instance 2');
c = MyClass('Instance 1');

根据我传入的唯一标识符,我 想a == c成为。True

笔记:

(1) 我不是在谈论操纵相等运算符——我a真的想成为与c.

(2) 这旨在作为库代码,因此必须强制执行唯一性——我们不能只指望用户做正确的事情(不管是什么)。

有没有实现这一目标的规范方法?我一直遇到这种模式,但我经常看到涉及影子类的解决方案,仅用于内部实例化。我想我有一个更清洁的解决方案,但它确实涉及 get() 方法,我想知道我是否可以做得更好。

标签: python

解决方案


我会使用元类。此解决方案避免调用__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

参考及详解:https ://stackoverflow.com/a/6798042/8747


推荐阅读