2016-07-27 3 views
1

목록이 있는데 필자는 파일을 사용합니다. 각 유형의 파일은 다른 f}으로 처리되어야합니다. 나는 "MyFile"이라는 클래스를 만들었고 거대한 if : elif : else : structure를 유지하기보다는 파일 유형이 키가 될 사전을 만들었습니다. 이것은 클래스 변수로 저장됩니다.메서드에서 메서드 변수로 반환 된 개체 메서드 호출

class MyFile(object): 

    def process_xlsx(self): 
     #process file stuff for Excel 
     pass 

    def process_docx(self): 
     #process file stuff for Word 
     pass 

    def get_filetype(self): 
     try: 
      return self.FileTypes[file_extension] 
     except KeyError: 
      return None #filetype not handled... yet 

    FileTypes = { 
     "XLSX": ("Excel File", process_xlsx), 
     "DOCX": ("Word Document", process_docx) 
     } 

다른 클래스/개체/모듈 내에서 MyFile 클래스를 인스턴스화하고 파일을 단계별로 실행하기 시작합니다. MyFile 개체가 제대로 만들어집니다.

f = MyFile("full_file_path_and_name") 
file_type = f.get_filetype() 

file_type에는 키와 함수 개체가있는 튜플이 있습니다. 다음은 그 예이다 : xls_0386.xlsx - ('엑셀 파일') doc_0386.docx - ('워드 파일')

질문 : f.get_filetype에서 반환 된 함수를 호출하려면 어떻게 ()?

file_type[1]() 

반환 값 : process_xlsx (1 개) 필요한 위치 인수 누락 '자기'

file_type[1] 

는 _ 오류를 생성하지 않습니다, 그러나 결코 실제로 호출 (중단 점은 프로세스 내에서 도달하지 못했다하게 ???? 메서드)

이렇게 다시 개체 메서드를 호출하는 구문은 무엇입니까?

나는 이것이 나의 세부 사항과 함께 설명하기 위해 약간 뒤얽힌다고 알고있다. 그리고 그것을 위해 나는 사과한다.

미리 감사드립니다.

답변

0

자기가 원하는 것을 첫 번째 인수로 부릅니다. 예를 들면 다음과 같습니다.

f = MyFile("full_file_path_and_name") 
file_type = f.get_filetype() 
file_type[1](f) 

이렇게하면 다른 파일을 사용할 수도 있습니다. file_type[1]으로 만 특정 파일을 호출하려는 경우 부분적으로 채워지는 기능을 사용하십시오. 따라서 self은 이미 인수입니다. 이러한 기능은 클래스 내에 선언되어 있기 때문에 당신은 functools.partial

import functools 

class MyFile(object): 

    # ... 

    def get_filetype(self): 
     def partial(func): 
      return functools.partial(func, self) 
     return {"XLSX": ("Excel File", partial(process_xlsx)), 
       "DOCX": ("Word Document", partial(process_docx)) 
       }.get(self.file_extension) 

# Then you just do 

f = MyFile("full_file_path_and_name") 
file_type = f.get_filetype() 
file_type[1]() 
+0

당신이 이미 알고 있듯이, 이것은 완벽하게 작동했습니다! 고맙습니다. 필자는 파이썬을 처음 사용하고 있으며 일부 세부 사항을 고민하고 있습니다. 이것은 나를 위해 또 다른 것을 채웠다. 또한 "부분"에 대한 추가 정보를 가져 주셔서 감사합니다. 나는 이것에 대해 더 깊이 파고들 것이다. 그러나 나는 그것이 내가 향하고 있다고 생각한 곳이다. 많은 칭찬. – billbris

0

하여이 작업을 수행 할 수 있습니다, 그들은 기능을 부르고 그 클래스에서 개체를 나타내는 인수 self 있습니다. 해당 함수를 MyFile 개체의 컨텍스트 외부에서 별도로 호출하려고하면 더 이상 함수 호출과 연결된 self 변수가 없습니다.

file_type[1](f) 
+0

고맙습니다. 이것은 자리에 있습니다. 나는 "자기"가 실종되었다는 것을 알았지 만 그것을 얻으려는 경험은 없었습니다. 이제 알았어. – billbris

1

당신이 class을 작성, 당신이 정의하는 방법을 :

missing 1 required positional argument: 'self'

그냥 이미 self 변수로 사용하기 위해 만든이 그것을 MyFile의 인스턴스를 제공합니다 : 당신이 오류가 발생하는 이유 기능 만입니다. 클래스의 인스턴스에서 이름을 검색 할 때만 해당 인스턴스에 바인드되어 바운드 메소드를 생성합니다. 이는 descriptor protocol을 통해 이루어집니다.

FileTypes = { 
    "XLSX": ("Excel File", process_xlsx), 
    "DOCX": ("Word Document", process_docx) 
    } 

사람들은 일반 기능은 다음과 같습니다

그래서 당신은 당신의 FileTypes 사전을 만들 때.

  1. 는 클래스 정의시에 사전을 만들지 마십시오 :

    당신은 기본적으로 세 가지 옵션을 사용할 수 있습니다. 당신이 인스턴스를 만들 때 만들기, 그래서 당신이 그것에 바인딩 방법을를 저장할 수 있습니다 :

    class MyFile(object): 
        def __init__(self):  
         self.FileTypes = { 
          "XLSX": ("Excel File", self.process_xlsx), 
          "DOCX": ("Word Document", self.process_docx) 
         } 
    

    을이 self의 방법을 검색하기 때문에, 그들은 바인딩됩니다.

  2. 바인드 '수동'방법이 get_filetype()에서 그들을 찾아 :

    from functools import partial 
    
    def get_filetype(self): 
        try: 
         return partial(self.FileTypes[file_extension], self) # also a kind of binding 
        except KeyError: 
         return None #filetype not handled... yet 
    
: 대신 함수의 위치 인수로 self

def get_filetype(self): 
    try: 
     return self.FileTypes[file_extension].__get__(self) # binding! 
    except KeyError: 
     return None #filetype not handled... yet 
  • 돌려 functools.partial() object

    세 가지 방법 모두 호출자에게 개체가 반환되어 호출 될 때 해당 개체가 전달됩니다. t 인스턴스를 MyFile()으로 선택합니다.

  • +0

    이것은 또한 모두 매우 정확합니다. 나는 당신이 계획 한 옵션 중 일부를 좋아하고 그것들을 고려할 것이며 그것들이 나의 개발 스타일에 어떻게 맞는지를 좋아할 것입니다. 통찰력을 가져 주셔서 대단히 감사합니다. 그들은 매우 도움이됩니다. – billbris

    관련 문제