Python:可订阅的类

时间:2011-04-24 23:38:49

标签: design-patterns python-3.x metaclass

我的class Item描述了某些项目,这些项目的数字ID(0,1,2,...)自然是已知的。我在类中实现了一个注册表,它通过ID来索引所有对象。我还有一个通过其ID检索对象的方法:

class Item
    _registry = []
    def __init__(self):
        self._registry.append(self)
        # ...
    @classmethod
    def get_item_by_id(cls, k):
        return cls._registry[k]
    # ...

这是一个合理的设计吗?

假设是,是否可以允许Item类本身的下标?我可以(我认为)在__getitem__的元类中定义Item,从而允许语法Item[2]而不是Item.get_item_by_id(2)

如果有任何问题(例如,太奇怪,可能导致不良副作用等),请告诉我。

1 个答案:

答案 0 :(得分:3)

不。那很好。它肯定比长形式更好。当有人使用不正确的索引时,请确保返回明智的异常(KeyError带有描述性消息,例如Invalid id for element)。此外,请确保记录此行为,否则首先使对象可下载是没有意义的。