我可以在不使用Python 3.6中的元类的情况下编写abc.ABC吗?

尼尔·G

Python 3.6添加了PEP 487,该__init_subclass__方法除其他外还添加了一种方法。是否可以编写ABC不使用元类的版本?

马丁·彼得斯(Martijn Pieters)

如果您只关心检查抽象方法,则可以。只需将抽象方法集计算移至该__init_subclass__方法:

def __init_subclass__(cls, **kwargs):
    super().__init_subclass__(**kwargs)
    # Compute set of abstract method names
    abstracts = {name
                 for name, value in vars(cls).items()
                 if getattr(value, "__isabstractmethod__", False)}
    for base in cls.__bases__:
        for name in getattr(base, "__abstractmethods__", set()):
            value = getattr(cls, name, None)
            if getattr(value, "__isabstractmethod__", False):
                abstracts.add(name)
    cls.__abstractmethods__ = frozenset(abstracts)

然后,基本object.__new__实现使用非空__abstractmethods__集来防止实例化。

但是ABC还支持虚拟子类注册; 两个钩形方法,这需要 要在元类实现。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我可以在不使用Python的文件的情况下创建sqlite3连接器吗?

我可以在不使用“ this”的情况下重写Javascript吗?

我可以在不使用R的情况下将.rda文件转换为python中的pandas数据框吗?

可以在不使用RDFlib的情况下在python(3.x)中处理.ttl或.tql文件吗?

我可以在不使用等待的情况下从异步中捕获错误吗?

我可以在不使用循环的情况下从此命令中删除 bash 子进程吗?

我可以在不使用 useState 的情况下访问 useEffect 中的变量吗?

我们可以在不使用 ionic 3 中的循环的情况下分配一个值为 1 或任何其他整数以外的数字值的变量吗

在不使用3rd(临时变量)的情况下进行交换会在该程序中给出差异答案,有人可以告诉我为什么吗?

我可以在不使用界面的情况下使用Windsor注入组件吗

我可以在不使用redux的情况下使用redux-form吗

我可以在不使用ionic的情况下使用cordova-plugin-ionic-webview吗?

我可以在不使用表的情况下使用 SQL Server 事务吗?

我可以在不使用IP的情况下创建以太网络吗

我可以在不使用 Java 循环的情况下填充二维数组吗?

我们可以在不使用Cloud Composer的情况下运行气流模板吗

我可以创建 LiveUSB 以在不使用 CD 的情况下安装 Lubuntu 吗?

我可以在不使用ID的情况下向svg元素添加蒙版吗?

我可以在不使用objectAtIndex的情况下阅读视图控制器吗?

我可以在不使用两个循环的情况下执行此任务吗?

我可以在不使用点表示法的情况下引用导入的类型吗

我可以在不使用文件缓存的情况下更快地复制大文件吗?

我可以在不使用SSH的情况下从cPanel运行grep吗?

我们可以在不使用 Firebase 的情况下向全球发送通知吗?

我可以在不使用控制器的情况下从laravel中的href标签返回视图吗?

我可以在不使用我的应用程序也使用VueX的情况下使用使用VueX的组件吗?

我可以不使用eval来编写此宏吗?

我可以省略在Kotlin中不使用的接口方法吗?

我可以不使用$ ctrl吗?在角度分量模板中