Trouble Trying To Dynamically Add Methods To Python Class (i.e. Django-tables2 'table')
Solution 1:
You're on the right track here, but instead of creating a barebones class and adding attributes to it, you should use the type() built-in function. The reason it's not working the way you're trying, is because the metaclass has already done its work.
Using type()
allows you to construct a new class with your own attributes, while setting the base class. Meaning - you get to describe the fields you want as a blueprint to your class, allowing the Table
s metaclass to take over after your definition.
Here's an example of using type()
with django. I've used this myself for my own project (with some slight variations) but it should give you a nice place to start from, considering you're already almost there.
defdefine_table(columns):
attrs = dict((c, tables.Column()) for c in columns)
klass = type('DynamicTable', (tables.Table,), attrs)
return klass
Solution 2:
You're confusing the __new__
of a "regular" class with the __new__
of a metaclass. As you note, Table
relies on __new__
method on its metaclass. The metaclass is indeed invoked when the class is defined. The class is itself an instance of the metaclass, so defining the class is instantiating the metaclass. (In this case, Table
is an instance of DeclarativeColumnMetaClass
.) So by the time the class is define, it's too late.
One possible solution is to write a Table
subclass that has some method refreshColumns
or the like. You could adapt the code from DeclarativeColumnMetaclass.__new__
to essentially make refreshColumns
do the same magic again. Then you could call refreshColumns()
on your new class.
Post a Comment for "Trouble Trying To Dynamically Add Methods To Python Class (i.e. Django-tables2 'table')"