如何从Python模块中提取类?

4 投票
2 回答
1589 浏览
提问于 2025-04-17 03:01

我正在尝试写一个脚本,这个脚本可以接收两个机器人,然后把它们传给一个引擎,让它们一起玩游戏。举个例子:

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

我遇到的问题是,我不知道怎么从通过命令行提供的模块中找到这些机器人对象。(如果有帮助的话,我完全不介意制定一些规则。)我该怎么做呢?

2 个回答

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..."
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

不过:

明确的比隐含的更好。 Python之禅

所以我还是建议让他们指定模块和类名的第一种方法。

撰写回答