Как создать класс словаря D, который хранит экземпляры некоторого класса «A» и наследует завернутые версии методов «A»?python dict объектов класса, который наследует атрибуты из объектов класса
Например, предположим, что a = A() и a.first() - это функция, которая что-то делает с «a» и возвращает некоторый объект. Тогда я хочу, чтобы d = D ({'k0': a0, 'k1': a1}) имел атрибут d.first(), который возвращает {'k0': a0.first(), 'k1': a1.first()} и изменяет базовые данные в a0 и a1, как и вызовы first().
Кроме того, я хочу только разоблачать методы (и, возможно, атрибуты), которые уже не существуют в классе Dict (не топает) И я хочу, чтобы это сделать динамически (без жесткого кодирования методов A, I уже знают, как набирать все методы вручную). Возможно, рассмотрим только методы, которые не начинаются с «_», если это проще.
Кроме того, я хотел бы, чтобы «D» выполнял обработку выходов из вызовов в зависимости от типов возврата (постобработка, упаковка вообще).
Кажется, что это может быть плохой идеей, но я просто хочу понять, какие подходы есть. Из моего чтения до сих пор, похоже, я мог использовать множественное наследование и написать свою собственную функцию __new__
или сделать что-то еще с метаклассированием. Но знание состоит в том, что вы, как правило, не обходитесь с __new__
, если вы не гуру, поэтому меня заставляют колебаться. Есть ли какой-нибудь декораторский трюк для этого? Я думаю, что я мог бы также использовать модуль проверки для прохождения класса «А», но это похоже на взлом.
Обновление: В качестве особого примера. Представьте себе, что у меня есть словарь pandas.DataFrames и что я хочу, чтобы коллекция появлялась и вела себя как можно больше, как один DataFrame с четным завершением табуляции методов, работающих в iPython (и я не использую pandas.Panel). Для простоты рассмотрим только поведение только для чтения (индексирование и выбор), такие вещи, как d.ix [0:10] и d.mean(), должны возвращать что-то от применения функции ко всем кадрам в словаре, в то время как d ['k0 '] должен вернуть значение в словаре, соответствующее ключу' k0 '. Комбинация жесткого кодирования и getattr делает то, что я хочу, но я изучаю, как это можно сделать с менее жестким кодированием.
Я думаю, что это общая проблема проектирования, в которой вы хотите динамически генерировать итерацию, которая ведет себя как объекты, которые она содержит.
Вы смотрели на '__getattr__'? – BrenBarn
@BrenBarn Вы имеете в виду просто обрабатывать наследование самостоятельно, проверяя __getattr__ на dict, а затем на 'A'? Полагаю, это более простое решение. – mathtick