gpt4 book ai didi

python - 如何判断一个类在 Python 3 中是否是抽象的?

转载 作者:行者123 更新时间:2023-12-01 12:26:42 24 4
gpt4 key购买 nike

我写了一个元类,它在运行时自动在字典中注册它的类。为了使其正常工作,它必须能够忽略抽象类。

该代码在 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 中的抽象类?

最佳答案

PEP3119描述了 ABCMeta 元类如何“标记”抽象方法并创建一个 __abstractmethods__ freezeset 包含一个类的所有方法,这些方法仍然是抽象的。所以,要检查一个类 cls是抽象的,检查是否 cls.__abstractmethods__是否为空。

我还找到了 this relevant post on abstract classes有用。

关于python - 如何判断一个类在 Python 3 中是否是抽象的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38707329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com