Определение подписываемого класса в Python с использованием __getitem__ [дубликат] ⇐ Python

Программы на Python
Anonymous
Определение подписываемого класса в Python с использованием __getitem__ [дубликат]

Сообщение Anonymous »

Я написал класс, но он не работает так, как хотелось:

Код: Выделить всё

class Varz:
_by_name = {}

@classmethod
def __getitem__(cls, name):
if name not in cls._by_name:
cls._by_name[name] = cls(name)
return cls._by_name[name]

def __init__(self, name):
self.name = name

print(Varz['foo'])
#=> TypeError: type 'Varz' is not subscriptable
Основываясь на этом ответе на этот вопрос, я заставил его работать, используя вместо этого __class_getitem__:

Код: Выделить всё

class Varz:
_by_name = {}

def __class_getitem__(cls, name):
if name not in cls._by_name:
cls._by_name[name] = cls(name)
return cls._by_name[name]
Зачем нужно это специальное имя класса? Различные ИИ поначалу вели меня по неверному пути и настаивали на том, что оригинал должен был работать. И это показалось мне верным, особенно учитывая, что мой первоначальный подход работал нормально, когда я использовал обычное имя метода на уровне класса:

Код: Выделить всё

    @classmethod
def find_or_create(cls, name):
...
Так почему же __getitem__ обрабатывается иначе, чем find_or_create?
Python 3.12.6

Подробнее здесь: https://stackoverflow.com/questions/790 ... ng-getitem

Вернуться в «Python»