Python: подписной класс - PullRequest
       8

Python: подписной класс

3 голосов
/ 25 апреля 2011

My class Item описывает некоторые элементы, которые естественно известны по их числовому идентификатору (0, 1, 2, ...).Я реализовал реестр внутри класса, который индексирует все объекты по их идентификатору.У меня также есть метод, который извлекает объект по его идентификатору:

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 Ответ

3 голосов
/ 25 апреля 2011

Неа.Это прекрасно.Это определенно лучше, чем длинная форма.Просто убедитесь, что вы возвращаете разумные исключения (KeyError с описательным сообщением, например Invalid id for element), когда кто-то использует неверный индекс.Кроме того, убедитесь, что вы задокументировали это поведение, иначе не было бы смысла делать объект подписанным в первую очередь.

...