Metaclasses for class mangling after definition.
Daniele Varrazzo
dvarrazzo at virgilio.it
Mon Jul 19 11:09:52 EDT 2004
Hi everybody,
I am writing a base class for <<entity>> stereotype classes, to implement
controlled access to the state and expose some of the access logic (in order
to dinamically build javascript code for client-side checks, for example).
Currently the idiom needed to subclass it is something like:
class Group(Entity):
_interface = Entity._extend_interface(
id = Direct(state_field='grp_id',
filters=(ReadOnlyFilter(),),
doc="The univocal database id for the group."),
name = Direct(
filters=(
StringFilter(),
MaxLenFilter(max_len=40,
message="The group name can be at most "
"%(max_len)s characters long."),),
doc = "A descriptive name for the group."),
)
_state = Entity._extend_state(
grp_id=None,
name=None,
)
# ... class definition ...
make_entity(Group)
The make_entity() call compiles some dinamically generated code to produce
the properties required to access the class. But adding such line after each
entity definition bothers me.
I don't know much about metaclasses: could they help me to automatically
perform such mangling on the classes "at compile time" (or at least once in
the class lifetime)? Hints about that?
What make_entity does is here down. Basically each Field instance (Direct is
a Field subclass) in the _interface dictionary (a class member) create a
property object on the same class that will perform the access for the class
instances.
def make_entity(entity):
"""Complete the Entity subclass building its attributes."""
for (field_name, field) in entity._interface.iteritems():
if not hasattr(entity, field_name):
field.field_name = field_name
field.create_accessors(entity)
Thank you in advance
Daniele
More information about the Python-list
mailing list