Passei pela maior parte da documentação dos documentos do __getitem__
Python, mas ainda não consigo entender o significado dela.
Então, tudo o que consigo entender é que __getitem__
é usado para implementar chamadas como self[key]
. Mas qual é a utilidade disso?
Digamos que eu tenho uma classe python definida desta maneira:
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def __getitem__(self,key):
print ("Inside `__getitem__` method!")
return getattr(self,key)
p = Person("Subhayan",32)
print (p["age"])
Isso retorna os resultados conforme o esperado. Mas por que usar __getitem__
em primeiro lugar? Também ouvi dizer que o Python chama __getitem__
internamente. Mas por que isso acontece?
Alguém pode explicar isso com mais detalhes?
__getitem__
uso no seu exemplo não faz muito sentido, mas imagine que você precise escrever uma classe personalizada de lista ou dicionário, que precisa trabalhar com o código existente que o usa[]
. Essa é uma situação em que__getitem__
é útil.Respostas:
Cong Ma faz um bom trabalho ao explicar para que
__getitem__
serve - mas quero dar um exemplo que pode ser útil. Imagine uma classe que modela um edifício. Dentro dos dados para o edifício, inclui vários atributos, incluindo descrições das empresas que ocupam cada andar:Sem usar
__getitem__
, teríamos uma classe como esta:No entanto, poderíamos usar
__getitem__
(e sua contrapartida__setitem__
) para tornar o uso da classe Building 'mais agradável'.Se você usa
__setitem__
esse método realmente depende de como planeja abstrair seus dados - nesse caso, decidimos tratar um edifício como um contêiner de pisos (e você também pode implementar um iterador para o edifício, e talvez até a capacidade de dividir - ou seja, obtenha mais de um andar de dados por vez - depende do que você precisa.fonte
building1[2]
a si próprio internamente, chama o getitem. Portanto, o argumento @ tony-suffolk-66 está fazendo é que, qualquer propriedade / variável da classe pode ser recuperada durante o tempo de execução, simplesmente chamando objectname [nome da variável]. Apenas esclarecendo isso, pois inicialmente não estava claro para mim e escrevendo aqui, esperando que ajude alguém. Exclua se redundante, por favorlen()
, e você receberá umTypeError
:TypeError: object of type 'Building' has no len()
A
[]
sintaxe para obter itens por chave ou índice é apenas açúcar de sintaxe.Quando você avalia
a[i]
chamadas em Pythona.__getitem__(i)
(outype(a).__getitem__(a, i)
, mas essa distinção é sobre modelos de herança e não é importante aqui). Mesmo que a classe dea
não possa definir explicitamente esse método, ele geralmente é herdado de uma classe ancestral.Todos os nomes de métodos especiais (Python 2.7) e suas semânticas estão listados aqui: https://docs.python.org/2.7/reference/datamodel.html#special-method-names
fonte
O método mágico
__getitem__
é basicamente usado para acessar itens de lista, entradas de dicionário, elementos de matriz etc. É muito útil para uma rápida pesquisa de atributos de instância.Aqui estou mostrando isso com uma classe de exemplo Pessoa que pode ser instanciada por 'nome', 'idade' e 'dob' (data de nascimento). O
__getitem__
método é escrito de uma maneira que se pode acessar os atributos da instância indexada, como nome ou sobrenome, dia, mês ou ano do dob, etc.Suponha que uma entrada do usuário seja a seguinte:
Com a ajuda do
__getitem__
método, o usuário pode acessar os atributos indexados. por exemplo,fonte