Por lo tanto, estoy leyendo un poco sobre metaclases en Python, y cómo el alter-ego de tres argumentos de type()
se usa para crear clases dinámicamente. Sin embargo, el tercer argumento es generalmente un dict
que inicializa la clase '__dict__
' de la clase que se creará.Metaclasses y __slots__?
Si quiero crear dinámicamente clases basadas en una metaclase que use __slots__
en lugar de __dict__
, ¿cómo podría hacer esto? ¿Todavía se usa type()
de alguna manera junto con __new__()
?
Como un FYI, soy consciente de los usos adecuados para __slots__
, para ahorrar memoria al crear grandes cantidades de una clase en lugar de abusar de ella para aplicar una forma de seguridad de tipo.
ejemplo de una clase normal (de nuevo estilo) que establece __metaclass__
y utiliza un __dict__
: el cuarto argumento
class Meta(type):
def __new__(cls, name, bases, dctn):
# Do something unique ...
return type.__new__(cls, name, bases, dctn)
class Foo(object):
__metaclass__ = Meta
def __init__(self):
pass
En lo anterior, type.__new__()
se llama y (que se convierte en la tercera cuando se utiliza en realidad) crea un __dict__
en Foo
. Pero si quisiera modificar Meta
para incluir __slots__
, entonces no tengo ningún diccionario para pasar a la función type()
__new__()
(hasta donde yo sé, no he probado nada de esto todavía, solo ponderando e intentando encontrar algo tipo de escenario de caso de uso).
Editar: Un cálculo rápido, pero no probado, es tomar un diccionario de los valores que se ponga en las variables de __slots__
y pasarlo a type.__new__()
. A continuación, agregue __init__()
a Meta
que rellena las variables __slots__
del dict. Aunque, no estoy seguro de cómo que dict alcanzaría __init__()
, debido a que la declaración de __slots__
impide __dict__
que se creen menos __dict__
se define en __slots__
...
Esto parece interesante. Lo intentaré en unos minutos. – Kumba
Nunca llegué a probar esto, pero creo que esto técnicamente responde la pregunta. Lo resolveré algún día. – Kumba
Recién ahora inicie sesión en SO en años; esta respuesta es finalmente lo que funcionó. ¡Gracias! – Kumba