确保 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")
我正在编写一个基于插件的应用程序。插件规范的一部分是插件 不得 实现 __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")