Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> непонятно, почему вызывается метод, __getitem__ 
V
    Опции темы
alex_smirnov
Дата 13.10.2008, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 22.6.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 4



Добрый день!

Вот смотрю я на код отсюда и не понимаю:

Код

import sets
class Keeper(object):
    def __init__(self, keep):
        self.keep = sets.Set(map(ord, keep))
    def __getitem__(self, n):
        if n not in self.keep:
            return None
        return unichr(n)
    def __call__(self, s):
        return s.translate(self)
        
makefilter = Keeper

if __name__ == '__main__':
    just_vowels = makefilter('aeiouy')
    print just_vowels(u'four score and seven years ago')
    print just_vowels(u'tiger, tiger burning bright')



Не понимаю следующее:
-- почему метод translate вызывает __getitem__? 

(Я понимаю, что этот метод может вызываться снаружи по определенным правилам, но почему он вызывается внутри?)

Спасибо.
PM GTalk Jabber   Вверх
Daevaorn
Дата 13.10.2008, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 9
Всего: 70



А вы смотрели описание метода `translate` у строки?

Там первым параметром идет таблица преобразования, ну т.е. лист обычный с доступом по индексу.

Тут
Цитата(alex_smirnov @  13.10.2008,  13:16 Найти цитируемый пост)
 return s.translate(self)

в качестве таблицы передается сам объект и внутри `translate` у него зовется `__getitem__` как у листа

Это сообщение отредактировал(а) Daevaorn - 13.10.2008, 15:24
PM MAIL WWW   Вверх
alex_smirnov
Дата 13.10.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 22.6.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 4



Да, описание я смотрел, но не догонял, сейчас, кажется, догнал.

Давайте по порядку...

1. Мы передали объект Keeper как объект содержащий таблицу символов.
2. Когда translate отрабатывает, данный ему объект он воспринимает как список или кортеж и работает с ним должным образом через внутренний метод __getitem__.

Логику понял. Спасибо!

Только вот:
Чтобы дальше на подобных ООП штуках не особо втыкаться, подскажите, пожалуйста, конкретные источники, где хорошо описаны методы типа __getitem__(), чтобы была информация: когда вызывается, как вызывается, что возвращает и т.д.
PM GTalk Jabber   Вверх
Daevaorn
Дата 17.10.2008, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 9
Всего: 70



Цитата(alex_smirnov @  13.10.2008,  18:04 Найти цитируемый пост)
Чтобы дальше на подобных ООП штуках не особо втыкаться, подскажите, пожалуйста, конкретные источники, где хорошо описаны методы типа __getitem__(), чтобы была информация: когда вызывается, как вызывается, что возвращает и т.д. 

Самый лучший источник - это официальная документация. В частности, всякие такие "магические методы" описаны тут . Конкретно __getitem__ здесь
PM MAIL WWW   Вверх
alex_smirnov
Дата 18.10.2008, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 22.6.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 4



Вооот, спасибо!

И точно, "читайте доки, доки -- рулез!".

Пошел изучать. Тема исчерпана.
PM GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0417 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.