Проблема при попытке динамически добавлять методы в класс Python (т.е. django-tables2 'Table')

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

Похоже,Джанго-tables2 Приложение предоставляет хорошую функциональность для рендеринга таблиц, но требует, чтобы вы либо явно объявляли имена столбцов, объявляя атрибуты в пользовательском подклассе таблиц, либо предоставляли модель для него, чтобы вывести столбцы.

Т.е. использовать столбец с именем "название", вы'буду делать:

class NameTable(tables.Table):
   name = tables.Column()

Класс Tables не предоставляет метод для добавления столбцов post-facto, потому что при чтении источника он, похоже, использует метакласс, который подметает атрибуты класса в __new__ и блокирует их.

Казалось, что очень простое метапрограммирование было бы элегантным решением. Я определил базовую фабрику классов, которая принимает имена столбцов в качестве аргументов:

def define_table(columns):
    class klass(tables.Table): pass              
    for col in columns:
        setattr(klass, col, tables.Column())
    return klass

К сожалению, это не работает. Если я бегу

x = define_table(["foo", "bar"])(data)
x.foo
x.bar

Я вернусь:



Но если я перечислю столбцы:

print x.base_columns

Я ничего не получаю, т. Е. {}

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

Любая идея, что яя не так делаю? Моя теория состоит в том, что метод __new__ (который переопределен в таблице метаклассов) вызывается, когда определяется класс, а не когда он 'с момента его создания, так что к тому времени, когда я прикреплюсь к атрибутамслишком поздно Но это нарушает мое понимание того, когда должно произойти __new__. В противном случае яЯ пытаюсь понять, как метакласс __new__ может отличить атрибуты, определенные в коде, от динамически определенных.

Спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос