Как извлечь классы из модулей Python? - PullRequest
4 голосов
/ 25 сентября 2011

Я пытаюсь написать скрипт, который берет двух ботов, а затем передает их движку, чтобы они могли играть в игру.В качестве примера использования:

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

Проблема, с которой я столкнулся, заключается в том, что я понятия не имею, как обнаружить / получить объекты Bot из модулей, предоставляемых через командную строку.(Если это поможет, я бы вообще не отказался от соблюдения конвенций.) Как мне это сделать?

Ответы [ 2 ]

3 голосов
/ 25 сентября 2011

Вам, вероятно, понадобится и имя класса, и имя модуля. С этим вы можете использовать это:

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

Тем не менее:

Явное лучше, чем неявное. - Дзен Питона

Так что я бы придерживался первого подхода, позволив им указать модуль и имя класса.

1 голос
/ 25 сентября 2011

Одним из наиболее распространенных шаблонов для этой проблемы является определение в вашем 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..."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...