2014-02-16 3 views
0

저는 파이썬으로 시작했고 '파일'클래스에서 파생 된 파일 객체 클래스를 만들어 대용량 데이터 파일을 조작 할 수있게되었습니다. 다음과 같이 작성된 특정 파일에 대해 작업 할 구체적인 방법을 만들었습니다. MyClass의 새 인스턴스를 각 메서드에서 작업 한 후에도 계속 반환해야합니다. 문제는 동일한 메소드를 여러 번 사용하면 MyClass 인스턴스의 지원으로 계속 사용되기 때문에 임시 파일로 사용되는 foo.txt 파일과 충돌이 발생한다는 것입니다. 이 문제를 해결할 방법이 있습니까? 또는 모든 파일에 대해 임의의 이름을 만들어야합니까? 귀하의 답변파이썬 : 파일과 객체의 충돌

감사합니다, 조지

Class MyClass(file): 
    "Similar to open(file_path,'r')" 
    def __init__(self,file_path): 
     file.__init__(self,file_path) 
    self.tell() 

    def method(self): 
     """Extract informations from self to write them in a temporary file foo.txt 
     that will be used to return a new instance of MyClass""" 
     output=open('foo.txt','w') 
     self.seek(0) 
     # Extracting information from self 
     output.write(information) 
     output.close() 
     return MyClass('foo.txt') 

나는 좀 더 명확하게 할 수있는 exemple를 완료했습니다. 내 문제는 내가 메서드에서 만드는 파일에서 MyClass의 새 인스턴스를 반환한다는 것입니다. foo.txt에서 생성 된 인스턴스를 닫지 않고이 메소드를 여러 번 사용하면 foo.txt가 다시 써지기 때문에 인스턴스가 비어 있고 '없음'이 반환됩니다. exemple의 경우 : b는

+1

HTH는 당신이 당신을 위해 임시 파일을 만들 수있는 ['TEMPFILE'] (http://docs.python.org/2/library/tempfile.html) 모듈을 찾고있는 느낌을 얻을. 그러나 당신의 질문에서'file_path'와''foo.txt''가 어디에서오고 있는지 명확하지 않습니다. –

+0

내가 틀릴 수도 있지만 임시 파일이 내 문제를 해결하지 못할 것이라고 생각합니다. Python에서 (파일없이) 처음부터 파일 객체를 만들거나 파일 객체를 파일을 지원하는 파일과 독립적으로 만들 수 있습니까? – GeorgeDean

+1

'method'를 실행할 때마다 왜 새 인스턴스가 필요한가요? 이런 식으로 파일 액세스 동기화, 임시 파일 닫기 등 몇 가지 추가 문제를 해결해야합니다. –

답변

1

아니라 비어 있기 때문에

a=MyClass('/path/to/file') 
b=a.method() 
c=b.method() 

그런 다음 당신의 진단이 옳다, 오류를 반환하고, 문제는 사용 사례는 잘못된 것입니다. 당신은 당신이 원하는 것처럼 보이는 것을하고 싶지 않을 경우, 여기 그것이 작동하는 방법 : 당신이 인수를 제공하는 방법을 간단하고 잘 작동합니다

a=MyClass('/path/to/file') 
a.method('/path/to/foo.txt') 
b=MyClass('/path/to/foo.txt') 
b.method('/path/to/bar.txt') 
c=MyClass('/path/to/bar.txt') 

가 (물론, 내가의 세부 사항을 제공하지 않습니다 ~ open()). 그것은, elegancy 부족합니다.

가 개선하려면

, 당신은 당신이 원하는 것을 할 수있게된다 고유 한 임시 파일을 생성 할 수 있습니다 :

a=MyClass('/path/to/file') 
b=a.method() 
c=b.method() 

을하지만 문제는 여전히 제대로 새로 만든 처리하지 않는다는 것입니다/임시 파일을 열었습니다. 당신은 할 수있다,

물론
import tempfile 

Class MyClass(): 
    def __init__(self,file): 
     self.file = file 

    def method(self): 
     """Extract informations from self to write them in a temporary file foo.txt 
     that will be used to return a new instance of MyClass""" 
     output = tempfile.TemporaryFile() 
     self.seek(0) 
     # Extracting information from self 
     output.write(information) 
     return output 

, 즉 그 일을하는 한 가지 방법이다 : 당신이 더 이상 필요하지 않을 때

with open('/path/to/file') as a: 
    with MyClass(a).method() as b: 
     with MyClass(b).method() as c: 
      # use a, b and c files here 
      pass 
# and now, a is closed, b and c are deleted. 

그래서 당신이 파일을 닫고 : 그래서, 당신은 더 나은 사용 환경 관리자 거라고 다른 많은 방법으로 그것을 해결하십시오. 이 솔루션의 장점은 temporary file gets deleted when you close() is called이며 파일의 컨텍스트를 종료 할 때 발생합니다.

물론 구현할 수있는 다른 방법이 있지만이 방법을 사용하면 가장 간단하고 명확한 방법을 찾을 수 있습니다 (물론 method()에 명시 적으로 지정).

+1

+1은'method'에'MyClass'의 새로운 인스턴스를 반환하지 않기 때문에 물론 좋고 도움이되는 답변입니다 :) – danodonovan

+0

잘 @ danodonovan, 당신 말이 맞아요. : 좋은 OOP에서 유일하게 허용되는 경우, 메소드에서 현재 클래스의 새 인스턴스를 반환합니다. 이는 클래스 메소드 인 정적 메소드에서 가져온 것입니다. 그렇지 않으면 공장 패턴을 구현할 수 있습니다. 그렇지 않으면 디자인이 잘못되었습니다! ;-) – zmo

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 메서드를 적용하기 전에 새 인스턴스를 직접 만들어야하기 때문에 개체를 처리하는 것은 좀 더 복잡하지만이 방법으로는 "파이썬 (pythonic)"일 수 있습니다. 그러나 솔루션을 잘 만들려면'file.seek (0)'줄을 생성자에 추가해야합니다. 그렇지 않으면 빈 객체가 생성됩니다 :) – GeorgeDean