Python всегда ищет __getitem__
и другие магические методы в классе, а не в экземпляре. Так, например, определение __getitem__
в метаклассе означает, что вы можете индексировать класс (но вы не можете определить его, делегировав несуществующему __getitem__
в type
- точно так же, как вы никогда ничего не можете определить, делегируя другим несуществующим методам, конечно; -).
Итак, если вам нужно проиндексировать класс, такой как Settings
, ваш пользовательский метакласс должен действительно определять __getitem__
, но он должен определять его с явным кодом, который выполняет желаемое действие - return cls._config.get
, который вы хотите .
Редактировать : позвольте мне привести упрощенный пример ...:
>>> class MyMeta(type):
... def __getitem__(cls, k):
... return cls._config.get(k)
...
>>> class Settings:
... __metaclass__ = MyMeta
... _config = dict(foo=23, bar=45)
...
>>> print Settings['foo']
23
Конечно, если бы это было все, что было нужно, было бы глупо проектировать этот код как "индексирование класса" - классу лучше иметь экземпляры с состояниями и методами, иначе вы должны просто написать код модуль вместо ;-). И почему «правильный» доступ должен осуществляться путем индексации всего класса, а не конкретного экземпляра и т. Д., Далеко не ясно. Но я сделаю вам комплимент, если предположим, что у вас есть веская причина для конструирования таких вещей, и просто покажу вам , как реализовать такую структуру; -).