2010-12-10 3 views
4

파이썬 런타임 중 메소드의 기능을 변경하는 방법

런타임 중에 메소드의 기능화를 변경할 수 있는지 궁금해합니다. 예 :

x = obj1 + obj2 
return x+y 

x = obj1 + obj2 
x+= obj3 
return x+y 
를 추가하려고합니다.
+0

http://mywiki.wooledge.org/XyProblem –

+1

무엇이'y'입니까? 'Y'는 무엇입니까? 'return x = Y'는 무엇을 의미합니까? –

+0

return x = y, whatrever x와 y는 파이썬에서 유효하지 않은 표현입니다. – Ant

답변

2

모든 것이 가능하다 추가 할 스택 조작을 수행하고 런타임에 바이트 코드를 삽입 할 수 있습니다. 같은 물건을 byteplay과 같이 보아라.

하지만 왜?

그런 수정은 직관력이없고 읽을 수 없으므로, 먼저 x += obj3을 남겨두고 obj30으로 설정하면 더 좋습니다. 그 행이 필요할 때 obj3에 0이 아닌 값을 사용합니다 ...

+0

그냥 바이트 플레이를 찾고 있었는데, 조사 할만한 가치가있는 영역을 보았습니다. – user537638

1

런타임 중에 메소드의 기능을 변경하는 것은 항상 어떤 프로그램을 수행하는지입니다. 그것은 "일반화 (generalizing)"라고 불립니다.

당신이하는 일은보다 일반적인 알고리즘을 작성하는 것뿐입니다. 그것은 어렵지 않습니다.

def run_time_change(y, *object_list): 
    x=sum(object_list) 
    return x+y 

example1 = run_time_change(y, obj1, obj2) 
example2 = run_time_change(y, obj1, obj2, obj3) 

"런타임"코드가 변경되는 곳이 없습니다. 그건 틀렸어요.

더 정확한 알고리즘을 작성하는 것이 올바른 일입니다.

+0

괜찮 았는데, 합계는 단지 예제 일뿐입니다. 이것을 생성하는 방법은 내가 알고 싶었던 것입니다! – user537638

+0

@ user537638 : "합계가 그 예"였습니다. 런타임에 코드를 수정하지 마십시오. 당신은보다 일반적인 알고리즘을 작성합니다. 이 경우 좀 더 일반적인 알고리즘을 작성했습니다.** 모든 ** 경우 (** all **)에서는보다 일반적인 알고리즘을 작성합니다. –

+0

이상적인 상황이지만, 때로는 사용자가 무엇을 바꾸고 싶은지 모릅니다! 내 사용자 (과학자)는 때로는 문장, 방법 등을 '마음'에 맞게 변경하려고합니다. 피드백에 감사드립니다! – user537638

8

파이썬 클래스는 런타임에 변경 될 수있는 개체입니다. 그래서 예를 들면 :

class Dog: 
    def talk(self): 
     print "bark" 
dog1 = Dog() 
dog1.talk() # --> Bark 

def cat_talk(self): 
    print "Meow" 

Dog.talk = cat_talk 
dog1.talk() # --> Meow 

하지만 당신이 또는 누구든지 같은 일을 원하지 않는 확실히이 프로그램은 당신을 죽일 것을 시도 할 것이다 유지하거나 디버깅 할 것이다 (그리고이 사람은 아마 자신이 될 것입니다)

0

당신이하고 싶은 것을 완전히 명확하게 밝히지는 않았지만, changing methods and classes at runtime is called "Monkey Patching", 그리고 파이썬에서 (그 이름에서 알 수 있듯이) 눈살을 찌푸리게됩니다.

이유는 어떤 버전의 메소드가 호출되는지 코드를 읽는 것만으로 쉽게 알 수 있기 때문에 코드를 디버그하기가 매우 어렵 기 때문입니다. 또는 디버깅을 수행하는 사람은 메소드가 변경되었음을 알지 못하기 때문에보고있는 모든 동작을 이해할 수 있습니다.

메소드를 동적으로 변경할 수 있지만 그렇게하지 않는 것이 가장 좋습니다. 해결하려는 문제에 대한 자세한 내용을 제공하면 다른 사람이 더 "Pythonic"솔루션을 제안 할 수 있습니다.

관련 문제