Я прошел через большую часть документации __метод getitem__
в языке Python Docs, а также на сайте StackOverflow, так что это не дублировать вопрос. Но я до сих пор не в состоянии понять смысл.
Так что все, что я могу понять, что __метод getitem__
используется для осуществления звонков, как " я " [ключ]`. Но какая польза от этого?
Допустим у меня есть класс 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__
используется для - но я хочу дать вам пример, который может быть полезен.
Представьте себе класс, который моделирует здание. В данные для здание включает ряд атрибутов, в том числе описания компании, которые занимают на каждом этаже :
Без использования __метод getitem__
у нас был бы класс такой :
class Building(object):
def __init__(self, floors):
self._floors = [None]*floors
def occupy(self, floor_number, data):
self._floors[floor_number] = data
def get_floor_data(self, floor_number):
return self._floors[floor_number]
building1 = Building(4) # Construct a building with 4 floors
building1.occupy(0, 'Reception')
building1.occupy(1, 'ABC Corp')
building1.occupy(2, 'DEF Inc')
print( building1.get_floor_data(2) )
Однако мы могли бы использовать __метод getitem__
(и его аналог __setitem класса__
), чтобы сделать использование здания класса 'приятнее'.
class Building(object):
def __init__(self, floors):
self._floors = [None]*floors
def __setitem__(self, floor_number, data):
self._floors[floor_number] = data
def __getitem__(self, floor_number):
return self._floors[floor_number]
building1 = Building(4) # Construct a building with 4 floors
building1[0] = 'Reception'
building1[1] = 'ABC Corp'
building1[2] = 'DEF Inc'
print( building1[2] )
Используете ли вы __setitem класса__
как это на самом деле зависит от того, как вы планируете абстрактных данных - в этом случае мы решили лечить дома как контейнер пол (и вы могли бы также реализовать итератор для дома, а может быть даже возможность нарезать - т. е. получить больше, чем один этаж's данные одновременно - это зависит от того, что вам нужно.
Синтаксис []
для получения элемента по ключу или индексу-это просто синтаксис сахара.
Когда вы оцениваете а[я]
питон называет собой.метод getitem(я) "(или " типа(а).метод getitem(а, я), но это различие идет о модели наследования и не важно здесь). Даже если класс " а " не может явно определить этот способ, это, как правило, наследуется от класса-предка.
Все (питон 2.7) специальные имена методов и их семантика перечислены здесь: https://docs.python.org/2.7/reference/datamodel.html#special-method-names
Магический методметод getitem` используется в основном для доступа к элементам списка, словарных элементов массива и т. д. Это очень полезно для быстрого просмотра атрибутов экземпляра.
Здесь я показываю это на примере класса человек, который может быть создан с 'имя', 'время' и 'доб' (дата рождения). Метод __метод getitem__
написан таким образом, что можно получить доступ к индексируемых атрибутов экземпляра, такие как имя, фамилия, день, месяц и год рождения, и т. д.
import copy
# Constants that can be used to index date of birth's Date-Month-Year
D = 0; M = 1; Y = -1
class Person(object):
def __init__(self, name, age, dob):
self.name = name
self.age = age
self.dob = dob
def __getitem__(self, indx):
print ("Calling __getitem__")
p = copy.copy(self)
p.name = p.name.split(" ")[indx]
p.dob = p.dob[indx] # or, p.dob = p.dob.__getitem__(indx)
return p
Предположим, один вход пользователей выглядит следующим образом:
p = Person(name = 'Jonab Gutu', age = 20, dob=(1, 1, 1999))
С помощью методаметод getitem`, пользователь может получить доступ к индексируемых атрибутов. например,
print p[0].name # print first (or last) name
print p[Y].dob # print (Date or Month or ) Year of the 'date of birth'