Я просмотрел большую часть документации __getitem__
Python, но все еще не могу понять ее смысл.
Итак, все, что я могу понять, это то, что __getitem__
используется для реализации таких вызовов, как self[key]
. Но какая от этого польза?
Допустим, у меня есть класс python, определенный таким образом:
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"])
Это возвращает ожидаемые результаты. Но зачем вообще использовать __getitem__
? Я также слышал, что Python вызывает __getitem__
внутренние вызовы . Но почему он это делает?
Может кто-нибудь объяснить это более подробно?
__getitem__
Использование в вашем примере не делает много смысла, но представьте себе , что вам нужно написать специальный list- или словарь-подобного класса, который должен работать с существующим кодом , который использует[]
. Это ситуация, когда__getitem__
это полезно.Ответы:
Конг Ма хорошо объясняет, что
__getitem__
используется, но я хочу привести вам пример, который может оказаться полезным. Представьте себе класс, моделирующий здание. В данных для здания он включает ряд атрибутов, включая описания компаний, занимающих каждый этаж:Без использования
__getitem__
у нас был бы такой класс:Однако мы могли бы использовать
__getitem__
(и его аналог__setitem__
), чтобы сделать использование класса Building «лучше».Действительно ли вы используете
__setitem__
это, зависит от того, как вы планируете абстрагировать свои данные - в этом случае мы решили рассматривать здание как контейнер этажей (и вы также могли бы реализовать итератор для здания и, возможно, даже возможность разрезать - т.е. получать данные с нескольких этажей за раз - это зависит от того, что вам нужно.источник
building1[2]
этот вызов, он внутренне вызывает getitem. Итак, суть @ tony-suffolk-66 заключается в том, что любое свойство / переменную класса можно получить во время выполнения, просто вызвав objectname [variablename]. Просто проясняю это, поскольку изначально мне было непонятно, и пишу здесь, надеясь, что это кому-то поможет. Удалите, еслиlen()
, и вы получитеTypeError
:TypeError: object of type 'Building' has no len()
[]
Синтаксис для получения элемента по ключу или индексу только синтаксис.Когда вы оцениваете
a[i]
вызовы Pythona.__getitem__(i)
(илиtype(a).__getitem__(a, i)
, но это различие касается моделей наследования и здесь не важно). Даже если классa
не может явно определять этот метод, он обычно наследуется от класса-предка.Все имена специальных методов (Python 2.7) и их семантика перечислены здесь: https://docs.python.org/2.7/reference/datamodel.html#special-method-names
источник
Магический метод
__getitem__
в основном используется для доступа к элементам списка, записям словаря, элементам массива и т. Д. Он очень полезен для быстрого поиска атрибутов экземпляра.Здесь я показываю это на примере класса Person, который может быть создан по «имени», «возрасту» и «доб» (дате рождения).
__getitem__
Метод написан таким образом , что можно получить доступ к индексированных атрибутов экземпляра, например, имя или фамилию, день, месяц или год DOB и т.д.Предположим, что один пользовательский ввод выглядит следующим образом:
С помощью
__getitem__
метода пользователь может получить доступ к индексированным атрибутам. например,источник