我编写了一个元类,它在运行时自动将其类注册到字典中。为了使其正常工作,它必须能够忽略抽象类。
该代码在 Python 2 中运行良好,但我在尝试使其与 Python 3 兼容时遇到了困难。
这是当前代码的样子:
def AutoRegister(registry, base_type=ABCMeta):
class _metaclass(base_type):
def __init__(self, what, bases=None, attrs=None):
super(_metaclass, self).__init__(what, bases, attrs)
# Do not register abstract classes.
# Note that we do not use `inspect.isabstract` here, as
# that only detects classes with unimplemented abstract
# methods - which is a valid approach, but not what we
# want here.
# :see: http://stackoverflow.com/a/14410942/
metaclass = attrs.get('__metaclass__')
if not (metaclass and issubclass(metaclass, ABCMeta)):
registry.register(self)
return _metaclass
Python 2 中的用法如下所示:
# Abstract classes; these are not registered.
class BaseWidget(object): __metaclass__ = AutoRegister(widget_registry)
class BaseGizmo(BaseWidget): __metaclass__ = ABCMeta
# Concrete classes; these get registered.
class AlphaWidget(BaseWidget): pass
class BravoGizmo(BaseGizmo): pass
不过,我想不通的是如何在 Python 3 中完成这项工作。
元类如何确定它是否正在初始化 Python 3 中的抽象类?