2010-04-06 3 views
14

ipython에서 이전에 정의 된 클래스의 멤버를 재정의하려면 따라야 할 좋은 방법이 궁금합니다. say : 아래처럼 클래스 소개를 정의한 후 나중에 _print_api 함수 정의의 일부를 다시 정의하려고합니다. 그것을 다시 입력하지 않고 그것을 할 수있는 어떤 방법.ipython에서 이전에 정의 된 클래스를 편집하는 좋은 방법

class intro(object): 
    def _print_api(self,obj): 
      def _print(key): 
        if key.startswith('_'): 
          return '' 
        value = getattr(obj,key) 
        if not hasattr(value,im_func): 
          doc = type(valuee).__name__ 
        else: 
          if value.__doc__ is None: 
            doc = 'no docstring' 
          else: 
            doc = value.__doc__ 
        return '  %s  :%s' %(key,doc) 
        res = [_print(element) for element in dir(obj)] 
        return '\n'.join([element for element in res if element != '']) 
    def __get__(self,instance,klass): 
      if instance is not None: 
        return self._print(instance) 
      else: 
        return self._print_api(klass) 

답변

0

실제로 "좋은"방법은 없습니다. 당신이 할 수있는 최선은 다음과 같이이다 :

# class defined as normally above, but now you want to change a funciton 
def new_print_api(self, obj): 
    # redefine the function (have to rewrite it) 
    ... 
# now set that function as the _print_api function in the intro class 
intro._print_api = new_print_api 

이미 정의 소개 객체를 (당신이 이미 새로운를 호출 생성 된 개체에 introObject._print_api를 호출 할 때 즉,이 경우에도 작동합니다 기능 설정). 불행하게도 함수를 재정의해야하지만 적어도 전체 클래스를 다시 작성할 필요는 없습니다.

사용 사례에 따라 가장 좋은 방법은 별도의 모듈에 넣는 것입니다. import 클래스를 변경하고 무언가를 변경해야하는 경우 reload() 함수 만 사용하면됩니다. 그러나 이것은 클래스의 이전 인스턴스에 영향을 미치지 않습니다 (이것은 원하는 것이거나 아닐 수도 있습니다).

0

많은 코드가있는 지점에 도달하면 파일에 넣는 것이 가장 쉽고 특정 모듈 import을 넣는 것이 가장 쉽습니다. 그런 다음 업데이트해야 할 때 파일을 편집하고 import 문을 다시 실행하면 이전에 정의 된 객체가 업데이트를받지 못하더라도 업데이트 된 코드가 표시됩니다.

+2

업데이트 된 코드를 얻으려면 실제로'reload (modulename)'함수를 사용해야합니다 -'import'를 다시 실행해도 아무런 효과가 없습니다 (큰 프로그램에서 같은 것을 가져 오면 여러 개의 가능한 위치에서 큰 성능 패널티가 발생하지 않음). –

5

당신이 IPython % 편집 기능을 사용하는 경우 % 편집 명령, 또는 그 별명 % 에드를 사용 this

10

같은 것을 사용할 수 있습니다. intro 클래스가 이미 ipython 네임 스페이스에 있다고 가정하면 %ed intro을 입력하면 클래스의 소스 코드에 외부 편집기가 열립니다. 편집기를 저장하고 종료하면 코드가 ipython에 의해 실행되어 효과적으로 클래스를 다시 정의합니다.

이미 존재하는 모든 인스턴스는 여전히 이전 버전의 클래스에 바인딩됩니다. 문제가 발생하면 개체를 다시 만들거나 obj를 다시 할당해야합니다. 클래스 속성은 클래스의 새 버전을 가리 킵니다.

모듈, 파일 및 이전 입력 행에 %ed을 사용할 수도 있습니다 (예 : %ed 5 10:13 16은 ipython 입력 행 5,10,11,12,13,16로 구성된 파일을 작성하고 편집합니다.

+0

정말 좋은 팁! 더 좋아하는 iPython 더 .. –

+5

흠, ipython에서 * 정의 된 클래스/함수 또는 가져온 클래스에서만 작동해야합니까? "ipython에 정의 된 클래스"가 제대로 작동하지 않습니다. 경고 : '<클래스'__main __. intro '>'가 정의 된 파일을 읽을 수 없습니다. '라는 메시지가 나타납니다. – weronika

+0

그게 뭘 찾고 있어요? 너무 - ipython에 정의 된 클래스를 편집하는 좋은 방법. – Zitrax

관련 문제