Что означает синтаксис индексации в круглых скобках вместо квадратных? - PullRequest
0 голосов
/ 08 мая 2020

В Python (пакет matplotlib) я создал объект ListedColormap, используя следующую строку:

listed_color_map = ListedColormap(('red', 'green', 'blue'))

Затем я увидел код, извлекающий цвета (например, зеленый) следующим образом:

listed_color_map(1)

Вызов предыдущей строки возвращает:

(0,0, 0,5019607843137255, 0,0, 1,0)

Я никогда не видел такого Индексирование со скобками (квадратные скобки здесь не работают). Для меня это выглядит так же, как вызов метода. Что это за синтаксис для получения значений из ListedColorMap точно?

И его также можно назвать так:

listed_color_map = ListedColormap(('red', 'green', 'blue'))(1)

Мне кажется, это похоже на вызов метода сразу после вызов конструктора, что для меня немного странно (в семействе C нет эквивалента этому).

1 Ответ

3 голосов
/ 08 мая 2020

Это означает, что экземпляры являются "вызываемыми", т.е. класс (или его родительский элемент) реализует метод __call__. Этот dunder метод позволяет "вызывать" экземпляры со скобками.

В вашем примере оказывается, что родительский элемент класса ListedColormap, который является классом ColorMap, реализует метод вызова dunder. Мы видим исходный код ListedColormap и его parent , который реализует этот интерфейс.

do c функции __call__ читает

Returns
-------
Tuple of RGBA values if X is scalar, otherwise an array of
RGBA values with a shape of ``X.shape + (4, )

, где X - ваш ввод, 1. Во втором примере вы более или менее делаете то же самое: вы создаете экземпляр класса ListedColormap и немедленно "вызываете" его с помощью скалярный аргумент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...