La definición MyClass
es una variable local para la función func
. No puede crear directamente una instancia de la misma, pero puede asignar sus funciones a una nueva clase, y luego usar la nueva clase ya que es la original. He aquí un ejemplo:
def func(params):
class MyClass(object):
some_param = 100
def __init__(self, *args):
print "args:", args
def blabla(self):
self.x = 123
print self.some_param
def getme(self):
print self.x
func.func_code
es el código de la función func
y func.func_code.co_consts[2]
contiene el código de bytes de la definición MyClass
:
In : func.func_code.co_consts
Out:
(None,
'MyClass',
<code object MyClass at 0x164dcb0, file "<ipython-input-35-f53bebe124be>", line 2>)
por lo que necesitamos el código de bytes para los MyClass
funciones:
In : eval(func.func_code.co_consts[2])
Out:
{'blabla': <function blabla at 0x24689b0>,
'__module__': '__main__',
'getme': <function getme at 0x2468938>,
'some_param': 100,
'__init__': <function __init__ at 0x219e398>}
Y finalmente creamos una nueva clase con metaclase, que asigna la función MyClass ns hasta la nueva clase:
def map_functions(name, bases, dict):
dict.update(eval(func.func_code.co_consts[2]))
return type(name, bases, dict)
class NewMyClass(object):
__metaclass__ = map_functions
n = NewMyClass(1, 2, 3, 4, 5)
>> args: (1, 2, 3, 4, 5)
n.blabla()
>> 100
n.getme()
>> 123
¿Por qué no pones tu clase en el alcance del módulo? – XORcist