如何从Python模块中提取类?
我正在尝试写一个脚本,这个脚本可以接收两个机器人,然后把它们传给一个引擎,让它们一起玩游戏。举个例子:
$: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之禅
所以我还是建议让他们指定模块和类名的第一种方法。