Невозможно перехватывать такие вызовы одним методом, по крайней мере, в 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))