2014-01-11 1 views
0

Я пытаюсь определить класс динамически, а затем его экземпляр. Для этого, что я делаю, у меня есть определение класса как строка, и я кормлю его функции eval, чтобы определить ее во время выполнения.Динамически загружать классы в Python

f="""class f: 
    def pr(self): 
     print "asdfg" 
    """ 
>>> eval(f) 

Traceback (most recent call last): 
    File "<pyshell#5>", line 1, in <module> 
    eval(f) 
    File "<string>", line 1 
    class f: 
     ^
SyntaxError: invalid syntax 

Почему я делаю это потому, что есть много классов, которые могут быть использованы, но редко они все необходимы вместе. Кроме того, я разрешаю пользователю добавлять новые классы в приложение.

Заранее спасибо.

Редактировать -------------------

Это питон 2,5 выход

data = """class f: 
    def pr(self): 
     print "asdfg" 
    """ 
>>> exec(data) 

Traceback (most recent call last): 
    File "<pyshell#14>", line 1, in <module> 
    exec(data) 
    File "<string>", line 4 

^
SyntaxError: invalid syntax 

#What i think the problem is "\n" 
>>> data 
'class f:\n def pr(self):\n  print "asdfg"\n ' 

им не уверен, но это где ошибка указывает.

Причина использования python 2.5 заключается в том, что scapy является частью программы и имеет поддержку только для python 2.5.

+3

Если ** пользователям ** вашей программы необходимо создать новые классы, вы делаете что-то неправильно. – jterrace

+1

Вы пытаетесь создать какую-то систему плагинов, где 'f' будет заполняться содержимым исходного файла Python? – ixe013

+0

@ ixe013: да, я думаю, что приведенное ниже решение будет работать. я фактически забыл об этом «exec()». – TheCreator232

ответ

4

exec, а не eval. exec выполнит произвольный код, а eval будет оценивать выражения (например, eval('2+3') == 5).

>>> data = """class f: 
    def pr(self): 
     print "asdfg" """ 
>>> exec data 
>>> instance = f() 
>>> instance.pr() 
asdfg 

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

+0

Thanx! Я забыл об этом «exec()». – TheCreator232

+0

Я знаю, что это не лучший способ это сделать, но это единственный способ я знаю, что в настоящее время известно, что другие способы сделать это. – TheCreator232

+0

ли этот метод работает и в Python 2.5? – TheCreator232