http://docs.python.org/library/functions.html#type
Es un poco difícil de Google para, pero se puede buscar python type(name, bases, dict) function examples
para obtener:
http://www.voidspace.org.uk/python/articles/metaclasses.shtml
Un extracto de lo anterior, que llega al corazón de su pregunta:
Los siguientes son básicamente equivalentes:
def __init__(self, x):
self.x = x
def printX(self):
print self.x
Test = type('Test', (object,), {'__init__': __init__, 'printX': printX})
y:
class Test(object):
def __init__(self, x):
self.x = x
def printX(self):
print self.x
Hay dos maneras de crear funciones sobre la marcha que se me ocurre. La forma generalmente mala es escribir el código y volver a analizarlo (aunque hecho correctamente, esto puede aumentar enormemente el rendimiento). La manera correcta es implementar una función que interprete su IDL. Esto se llama una función de orden superior: http://effbot.org/pyfaq/how-do-you-make-a-higher-order-function-in-python.htm
Un ejemplo de lo que iba a escribir, si no puede encontrar un intérprete para su IDL (de si se trata de una costumbre IDL) es algo así como el enlace anterior, tales como:
def makeMethod(idlCode):
syntax = MyIDL.parse(idlCode)
def newMethod(*args, **kw):
if syntax.statementType == MyIDL.IF_STATEMENT:
if secureLookup(mySyntaxTree.IF):
return secureLookup(args[0])
else:
return secureLookup(args[1])
...
return (syntax.methodName, newMethod)
Hay muchas maneras más elegantes de expandir este método, si se establece una correspondencia entre las construcciones de su IDL y la sintaxis de args * y ** kw, pero esto le da la mayor flexibilidad y es el más manera directa y básica en la que podría pensar.
Entonces será qué pasa en:
class DynamicIdlClass(object):
...
for idlObject in idlCode:
methods = dict(makeMethod(clause) for clause in idlObject.clauses})
methods['__init__'] = makeInitMethod(idlObject.initClause)
idlObject = type('Test', (DynamicIdlClass,), methods)
yield idlObject # or idlObjectsList.push(idlObject), etc.
¿Podría proporcionar un pequeño ejemplo de archivo de entrada y clase creada? – Simon