确保 Python 中没有 __init__ 函数

Ensuring the absence of an __init__ function in Python

我正在编写一个基于插件的应用程序。插件规范的一部分是插件 不得 实现 __init__ 方法,因为任何初始化都需要由插件管理器处理,而不是插件本身。 (插件编写者会在另一种方法中定义他们的启动代码,在满足某些检查后由插件管理器调用。)

要强制执行此样式,如果正在使用 __init__,插件管理器应该失败、抛出异常或执行其他一些令人沮丧的操作。

我想我可以检查一下是否定义了 __init__:

# minimaltest.py
__meta__ = "Minmimal metadata"
# main.py
import minimaltest
hasattr(minimaltest, '__meta__')  # => True
hasattr(minimaltest, '__somethingimadeup__')  # => False
hasattr(minimaltest, '__init__')  # => True?!

问题:hasattr 调用总是 returns 正确

如何确保任何预期的插件脚本 没有 实现 __init__ 方法?

hasattr returns True 因为 __init__ 的存在,因为我们创建的最小 class 继承自 Object,它来自定义了该方法。

如果我们想看看我们的最小class有哪些方法,没有得到它superclass定义的方法,你可以调用__dict__ 并得到一个 list ,它很容易针对使用 .keys:

进行测试
if '__init__' in minimal.__dict__.keys():
    raise RuntimeError("Plugins may not define __init__ methods")