2013-09-04 2 views
2

В питоне я могу сделать:питон EXEC, добавить STATICMETHOD к классу

exec(code_string, globals(), some_object.__dict__) 

добавить метод к объекту. Можно ли добавить статический метод в класс каким-то подобным образом? Как:

exec(code_string, globals(), ClassName.__dict__) 

Так что я мог бы статический вызывать метод:

ClassName.some_static_method() 

То, что я пытаюсь сделать, это добавить новые staticmethods во время выполнения данного некоторых питона код, определяющих метод. то есть, если бы я был дан:

code_string = ''' 
@staticmethod 
def test(): 
    return 'blah' 
''' 

как я могу создать и создать экземпляр этого в класс, так что я мог бы назвать это?

Надеюсь, я был достаточно ясен, спасибо!

РЕДАКТИРОВАТЬ: рабочий пример добавления функции к объекту:

class TestObject(object): 
    pass 

code_string = ''' 
def test(): 
return 'blah' 
''' 
t = TestObject() 
exec(code_string, globals(), t.__dict__) 
+0

Первое выражение, после «В Python я могу сделать : "дает объект' TypeError: 'dictproxy' не поддерживает присвоение позиции' в любом случае – samstav

+0

Я не могу получить форматирование в этом комментарии, поэтому я добавил его в сообщение. – lanthica

ответ

2

Использование setattr()

>>> code_string = ''' 
... @staticmethod 
... def test(): 
...  return 'returning blah' 
... ''' 
>>> 
>>> exec(code_string) 

>>> test 
<staticmethod object at 0x10fd25c58> 

>>> class ClassName(object): 
...  def instancemethod(self): 
...    print "instancemethod!" 
... 
>>> setattr(ClassName, 'teststaticmethod', test) 

>>> ClassName.teststaticmethod() 
'returning blah' 
>>> 

And here's an article on being safe with exec() and eval() in python.

+0

Спасибо, я думаю, что буду использовать эту тактику, хотя единственная проблема с ней в том, что она требует, чтобы я дал имя функции. Я могу придумать несколько способов работать с этим, спасибо, еще раз! – lanthica

+1

Мне было интересно, если это будет проблемой для вас. Я еще немного подумаю! – samstav

Смежные вопросы