python - 确保 Python 中不存在 __init__ 函数

标签 python class oop initialization python-import

我正在编写一个基于插件的应用程序。插件规范的一部分是插件不得实现__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 调用总是返回 True

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

最佳答案

对于 __init__ 的存在,hasattr 返回 True,因为我们创建的最小 class 继承自 Object,随定义的方法一起提供。

如果我们想查看我们的最小有哪些方法,无需获取其父类(super class)定义的方法,您可以调用__dict__ 并得到一个 list ,它很容易使用 .keys 进行测试:

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

关于python - 确保 Python 中不存在 __init__ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55786764/

相关文章:

c++ - 将派生自基类的类的实例传递给函数

c++ - 模板类类型特定的函数

Java 类变量等于相同的值

java - 如何替换java中的System类?

java - 从数据库加载 jar 并将其设置在类路径中

c++ - 如何删除由 OpenGL 绘制的 C++ 对象?

python - 类型错误 : Neo4j does not support PackStream parameters of type int64

python - 自动生成 Piratespeak .po/gettext/translations 用于 i18n 测试?

python - 如何用django比较日期

python - 使用 scrapy 抓取数据