2012-02-15 3 views
1

필자는 개인 용도로 python IRC 봇을 만들었으며, irc에 대한 irc 데이터를 검사하는 보조 파서를 다시로드하는 명령을 만들려고합니다 (기본 파서는 PING, quit/reload 명령).python에서 실행중인 클래스에서 메서드를 다시로드 할 수 있습니까?

클래스가 객체로 실행되는 동안 메소드에서 코드를 다시로드하는 방법이 있습니까? 내가 주변에 연주 한 코드 온라인에서 다른 많은 것들의 융합, 사물 : pastebin link

편집 : 여기

가 최신 정보 전체 코드에 대한 링크입니다 (명령이 많이 부족) 따라서 코드 최적화 (코드의 이상한 주석을 설명 함)가 있으면 환영받을 수도 있습니다.

답변

0

파이썬에서 기존 객체의 코드를 변경하는 것은 불가능합니다. 프로세스를 다시 시작해야합니다.

사람들은 다양한 방법을 시도하지만 그럴 가치가 없습니다. N 가져 오기는 파일이 한 번 실행되게하고 모든 가져 오기는 동일한 모듈 객체를 참조하기 때문에 모듈을 다시 가져 오는 것만으로는 작동하지 않습니다.

sys.modules 캐시를 손상시켜 가져 오기가 실제로 파일을 다시로드하려고하면 기존 개체가 참조하는 코드가 변경되지 않습니다. 그들은 여전히 ​​원래의 클래스와 메소드를 가리킬 것입니다. 다시로드 한 후 새로 만들어진 객체에는 새로운 코드가 있지만 모듈의 첫 번째로드에서 생성 한 모든 객체를 제거하는 것은 매우 어렵습니다.

+1

사실 * 불가능 *하지 않습니다. Hackish하고 약한, 긍정. 그러나 그것은 할 수 있습니다. –

+0

예를 들어'reload()'내장 함수를 고려해보십시오. –

+0

@KarlKnechtel : 사용 해보았습니까? 이미 생성 된 객체를 변경하려고 시도하지 않습니다. –

0

프로그램은 서로 함수 또는 메소드를 덮어 쓸 수 있습니다 :

def newparser(self, s): 
    print s, s 

myobject.parser = newparser 
myobject.parser("hello") # prints "hello hello" 

그러나 나는 그것이 좋은 생각이 아니다, 동의합니다. 나는 당신이 그런 것을 할 필요가 없다고 확신합니다.

+0

irc 연결을 닫은 후 고맙습니다. 예제가 프로그램의 다른 부분에서 유용 할 수 있지만, 방금 클래스의 새 인스턴스를 만들었습니다. – Billie

관련 문제