update - Python Metaclass: entender el ''con_metaclase()''
six 1.11 0 (2)
with_metaclass()
es una función de fábrica de clase de utilidad proporcionada por la biblioteca de six
para facilitar el desarrollo de código para Python 2 y 3.
Crea una clase base con la metaclase especificada para ti, compatible con la versión de Python con la que estás ejecutando el código.
Citando de la documentación:
Cree una clase nueva con base de clase base y metaclase de metaclass. Esto está diseñado para ser usado en declaraciones de clase como esta:
from six import with_metaclass class Meta(type): pass class Base(object): pass class MyClass(with_metaclass(Meta, Base)): pass
Esto es necesario porque la sintaxis para adjuntar una metaclase cambió entre Python 2 y 3:
Python 2:
class MyClass(object):
__metaclass__ = Meta
Python 3:
class MyClass(metaclass=Meta):
pass
La función with_metaclass()
utiliza el hecho de que las metaclases a) son heredadas por subclases, yb) se puede usar una metaclase para generar nuevas clases; efectivamente crea una nueva clase base al usar la metaclase como fábrica para generar una clase vacía:
def with_metaclass(meta, *bases):
"""Create a base class with a metaclass."""
return meta("NewBase", bases, {})
La metaclase de la clase base NewBase
es meta
, ambas en Python 2 y 3.
Quiero preguntar qué significa la llamada with_metaclass()
en la definición de una clase.
P.ej:
class Foo(with_metaclass(Cls1, Cls2)):
- ¿Es un caso especial donde una clase hereda de una metaclase?
- ¿La nueva clase es una metaclase también?
ACTUALIZACIÓN : desde entonces, la función six.with_metaclass()
ha sido parcheada con una variante de decorador, es decir, @six.add_metaclass()
. Esta actualización corrige algunos problemas de mro relacionados con los objetos base. El nuevo decorador se aplicaría de la siguiente manera:
import six
@six.add_metaclass(Meta)
class MyClass(Base):
pass
Aquí están las notas del parche y aquí hay un ejemplo similar y detallado y una explicación para usar una alternativa de decorador.