动态加载类

时间:2015-11-04 15:54:37

标签: python python-2.7 class inheritance

我的目标是动态加载我的不同子类并执行它们。要调用我的脚本,我正在使用它:

python Plugin.py Nmap execute google.com

或者

python Plugin.py Dig execute google.com

这是代码

父类:Plugin.py

class Plugin(object)
    def __init__(self):
        self.sName = ''
    def execPlugin(self):
        return 'something'
def main():
    # get the name of the plugin
    sPlugin = sys.argv[1]
    # create the object
    mMod = __import__(sPlugin, fromlist=[sPlugin])
    mInstance = getattr(mMod, sPlugin)
    oPlugin = mInstance()
    print oPlugin
    print type(oPlugin)
    if (sys.argv[2] == 'execute'):
        # then execute it
        return oPlugin.execPlugin(sys.argv[3])
if __name__ == '__main__':
    main()

位于Nmap / Nmap.py

中的子类
class Nmap(Plugin):
    def __init__(self):
        self.sName = 'Nmap'
    def execPlugin(self):
        return 'something else'

位于Dig / Dig.py中的子类

class Dig(Plugin):
    def __init__(self):
        self.sName = 'Dig'
    def execPlugin(self):
        return 'yeahhh'

我的问题位于

oPlugin = mInstance()

出现以下错误

TypeError: 'module' object is not callable

我尝试了很多东西,但没有任何效果。我怎样才能解决我的问题?

1 个答案:

答案 0 :(得分:1)

您的结构如下:

Plugin.py
/Nmap
    __init__.py
    Nmap.py
        # class Nmap(Plugin): ...

Plugin.py中,当您mMod = __import__(sPlugin, fromlist=[sPlugin]) sPlugin == 'Nmap' mMod时,/Nmap会引用目录Nmap.py文件mInstance = getattr(mMod, sPlugin)(请注意,文件和目录都可以是Python中的模块)。因此,mInstance使Nmap.py文件Nmap而不是类__init__.py

有两种解决方法:

  1. 使用/Nmap中的from Nmap import Nmap将课程“up”升级一级,即包括getattr;或
  2. Plugin.py中添加额外级别的{{1}}。
  3. 此外,您应遵循style guide's命名约定,这可能有助于您更快地跟踪问题。