2013-09-04 4 views
2

에 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

첫 번째 표현, 파이썬에서 "다음은 내가 할 수있는 : "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

관련 문제