类的动态加载

2024-05-23 19:24:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

python Plugin.py Nmap execute google.com

或者

python Plugin.py Dig execute google.com

这是密码

父类:插件.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中的子类/平均每年

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

位于Dig的子类/挖.py

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

我的问题出在

oPlugin = mInstance()

出现以下错误

TypeError: 'module' object is not callable

我试了很多东西,但都没用。我怎样才能解决我的问题?你知道吗


Tags: pyselfexecutereturnobjectinitdef子类
1条回答
网友
1楼 · 发布于 2024-05-23 19:24:22

你的结构如下:

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

Plugin.py中,当执行mMod = __import__(sPlugin, fromlist=[sPlugin])其中sPlugin == 'Nmap'时,这使得mMod引用目录/Nmap而不是文件Nmap.py(注意,文件和目录都可以是Python中的模块)。因此mInstance = getattr(mMod, sPlugin)使mInstance成为文件Nmap.py,而不是类Nmap。你知道吗

有两种方法可以解决此问题:

  1. 使用/Nmap中的__init__.py将类提升一级,即包含from Nmap import Nmap;或
  2. Plugin.py中添加一个额外级别的getattr。你知道吗

此外,您应该遵循style guide's命名约定,这可能会帮助您更快地跟踪问题。你知道吗

相关问题 更多 >