내가 MATLAB에서 파이썬 클래스의 __enter__
메소드를 호출 할 수있는 방법이 생각하지 않지만, __exit__
방법 이 암시 수 있습니다 불렀다 (나는 이것을 아래에서 더 언급 할 것이다).
이 먼저 범위는 정상적으로 통해 종료되는지 여부, 할당 및 범위 제한 방식으로 자원을 해제 할 수있는 방법을 제공하는 것입니다합니다 (__enter__
및 __exit__
방법을 통해) context managers의 목적을 고려하는 것이 중요합니다 오류. MATLAB은 "범위 지정"이라는보다 제한된 수단을 가지고 있습니다 : 각 함수는 자체적으로 workspace을 가지며 그 함수 내에서 루프, 조건문 등과 같은 제어 구조는 모두 해당 작업 공간을 공유합니다 (이러한 제어 구조가 자체 하위 함수를 갖는 많은 언어와 달리) 범위).
MATLAB에서 작업 영역을 종료하면 포함 된 변수가 지워지지 만 할당 된 모든 리소스가 여전히 해제되어야 할 수 있습니다. 이는 onCleanup
개체를 사용하여 수행 할 수 있습니다. 메모리에서 지워지면 기존 리소스를 관리하기위한 특정 기능을 호출합니다. example을 열고 파일에서 읽는 것 : 여기
function openFileSafely(fileName)
fid = fopen(fileName, 'r');
c = onCleanup(@() fclose(fid));
s = fread(fid);
...
end
이 파일이 열리고 이후에서 읽습니다. 기능을 종료 할 때
c
이 메모리에서 지워질 때 파일을 닫을 오브젝트
c
이 작성됩니다. 함수가 끝날 때 파일이
fclose(fid)
으로 간단하게 닫히면 함수를 종료하는 중 오류가 발생하여 (예 : 데이터를 읽는 중) 파일이 계속 열려있을 수 있습니다.
onCleanup
개체를 사용하면 함수가 종료되는 방식에 관계없이 파일이 닫힙니다. MATLAB 파이썬보다는 "컨텍스트 관리"의 다른 수단을 가지고 있기 때문에 그것은
__enter__
방법에 액세스 할 수없는 이유,이 설명 할 수
with open('some_file', 'w') as opened_file:
opened_file.write('Hola!')
: 다음은이 파이썬에서 처리 할 수있는 방법의 예입니다. 나는 내가 가지고 있었던 클래스와 시험했다 : io.FileIO
클래스. 먼저 도움을 청했습니다 :
>> py.help('io.FileIO.__enter__')
Help on method_descriptor in io.FileIO:
io.FileIO.__enter__ = __enter__(...)
도움말이 있습니다.특히 이 유용하지는 않지만이 있지만 거기에 있습니다. 내가 객체를 생성하고, 그 methods list 볼 때, 어느 쪽도 __enter__
도 __exit__
(도 명확한 상당)이 없다 :
>> fio = py.io.FileIO('test.txt');
>> methods(fio)
Methods for class py._io.FileIO:
FileIO eq ge le read readinto seek truncate writelines
char fileno gt lt readable readline seekable writable
close flush isatty ne readall readlines tell write
Methods of py._io.FileIO inherited from handle.
Methods for class handle:
addlistener eq findprop gt le ne
delete findobj ge isvalid lt notify
나는 그래도 fio
개체를 삭제했을 때 흥미로운 통지 일을했다. 파일이 열린 상태에서 fio
개체가 여전히 존재하는 동안 예상대로 파일을 삭제하거나 이동할 수 없습니다. 그러나 clear fio
, 명령을 실행 한 후에는 파일을 먼저 닫지 않아도 파일과 정상적으로 상호 작용할 수있었습니다. 이것은 파일이 자동으로 닫혔다는 것을 의미합니다. 이것은 __exit__
메서드가 암시 적으로 호출 될지 궁금하지만, 아직 확실하게 결정하지 못했습니다.