Можно ли использовать сопоставление с образцом на функциях в Python? Как, функция, которая будет отвечать на несколько вызовов - PullRequest
1 голос
/ 25 мая 2019

Я пытаюсь создать класс, который действует как список. Тем не менее, я хотел бы иметь возможность использовать все встроенные функции списка repr () и тому подобное, есть ли способ сделать что-то вроде этого:

class myList:
  ...
  def __getitem__(self, index):
    #custom getitem function
  def __setitem(self,index,value):
    #custom setitem function
  def toList(self):
    #returns a list

  #and a catch-all case:
  def __*__(*args):
    return self.toList().__*__(*args)

Итак, мой вопрос, возможно ли сделать универсальный случай для чего-то подобного в python, чтобы отловить такие вещи, как __repr__, __str__, __iter__ и т. Д.

Спасибо!

1 Ответ

0 голосов
/ 25 мая 2019

Невозможно перехватывать такие вызовы одним методом, по крайней мере, в CPython. Хотя вы можете определить специальные методы, такие как __getattr__, даже определение низкоуровневого __getattribute__ для метакласса не работает, потому что интерпретатор просматривает имена специальных методов, чтобы создать таблицу быстрого поиска типа, используемого типами определено в C . Все, что на самом деле не обладает такими индивидуальными методами, не будет отвечать на внутренние вызовы переводчика ( например, , из repr).

Что вы можете сделать, это динамически генерировать (или увеличить, как показано ниже) класс, который имеет любые специальные методы, которые вы хотите. Читаемость результата может сильно пострадать, чтобы сделать этот подход полезным:

def mkfwd(n):
  def fwd(self,*a): return getattr(self.toList(),n)(*a)
  return fwd
for m in "repr","str":
  m="__%s__"%m
  setattr(myList,m,mkfwd(m))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...