如何从Python模块中提取类?

时间:2011-09-24 22:44:59

标签: python module import

我正在尝试编写一个带有两个Bots的脚本,然后将它们提供给引擎以供他们玩游戏。作为示例用法:

$:python rungame.py smartbot.py dumbbot.py
Detected SmartBot in smartbot.py...
Detected DumbBot in dumbbot.py...
Running game...

我遇到的问题是我不知道如何检测/获取通过命令行提供的模块中的Bot对象。 (如果它有帮助,我根本不介意执行约定。)我该怎么做?

2 个答案:

答案 0 :(得分:3)

您可能需要类名以及模块名称。有了它,你可以使用它:

getattr(__import__(module_name), class_name)

如果您不想让它们指定类名,您可能能够找到以Bot结尾的类:

module = __import__(module_name)
clazz = None
for attribute_name in dir(module):
    attribute = getattr(module, attribute_name)
    if attribute_name.endswith('Bot') and callable(attribute):
        clazz = attribute
        break

然而:

  

明确比隐含更好。 - The Zen of Python

所以我坚持让他们指定模块和类名的第一种方法。

答案 1 :(得分:1)

此问题最常见的模式之一是在API中定义对象必须具有特定名称;例如,您可以调用该特殊变量bot

# smartbot.py
class SmartBot(object):
    "A very smart bot!"

bot = SmartBot()
# dumbbot.py
class DumbBot(object):
    "A dumb bot bot!"

bot = DumbBot()
# rungame.py
import sys
for source in sys.argv[1:]:
    l = {}
    execfile(source, l)
    bot = l["bot"]
    print "Detected %s in %s..." % (type(bot).__name__, source)
print "Running game..."