update python metaclass six-python

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.