파 이 썬 컨 텍스트 관리자 Content Manager

Python 에서 우 리 는 상하 문 관리자(Context Manager)를 자주 듣는다.그러면 이것 이 무엇 인지,또 어떤 기능 이 있 는 지 토론 해 보 자.
Python 의 컨 텍스트 관리자 에서 with 를 사용 하여 파일 을 여 는 것 이 가장 많 습 니 다.그 중에서 with 에 포 함 된 문 구 를 떠 난 후에 파일 을 닫 고 연결 대상 을 닫 는 등 청소 와 유사 한 작업 을 수행 합 니 다.
실천 하 다.
우 리 는 코드 를 실천 할 때 같은 코드 세 션 에서 먼저 파일 을 열 고 직접 파일 을 다른 처리 하 는 것 을 무시 했다.왜냐하면 이것 은 아무런 의미 가 없고 자원 이 점용 되 는 상황 이기 때문이다.
먼저 아래 검 측 코드 를 보십시오.

#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
# MedusaSorcerer Script
import os


class OpenFile:
    def __init__(self):
        self.file = None

    def open(self, path):
        self.file = open(path, 'w')


if __name__ == '__main__':
    file_path = 'medusa.md'
    file = OpenFile()
    file.open(file_path)
    os.remove(file_path)

코드 에서 저 희 는 파일 대상 을 인 스 턴 스 속성 으로 참조 하 였 습 니 다.그 후에 저 희 는 os 모듈 을 사용 하여 기 록 된 파일 을 삭제 합 니 다.코드 변경 세 션 을 실행 하면 다음 과 같은 내용 이 나타 납 니 다.
Traceback (most recent call last):
  File "medusa/main.py", line 19, in
    os.remove(file_path)
Permission Error:[WinError 32]다른 프로그램 이 이 파일 을 사용 하고 있 습 니 다.프로 세 스 에 접근 할 수 없습니다.:medusa.md'
Process finished with exit code 1
그것 은 삭 제 된 파일 이 자원 방출 을 받 지 못 했 기 때문이다.우 리 는 위의 기초 위 에서 함 수 를 사용 하 는 방식 을 진행한다.

#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
# MedusaSorcerer Script
import os


class OpenFile:
    def __init__(self):
        self.file = None

    def open(self, path):
        self.file = open(path, 'w')


def open_file(path):
    file = OpenFile()
    file.open(path)


if __name__ == '__main__':
    file_path = 'medusa.md'
    open_file(file_path)
    os.remove(file_path)

이 코드 는 성공 적 으로 실 행 될 것 입 니 다.함 수 를 실행 할 때 함수 안의 임시 변 수 는 회수 되 어 방출 되 기 때문에 OpenFile 의 인 스 턴 스 대상 이 방출 되 고 인 스 턴 스 속성 도 존재 하지 않 아 방출 되 기 때문에 실 행 될 것 입 니 다.
그럼 우리 의 조작 은 모두 함수 패키지 방식 으로 실행 해 야 합 니까?with 의 등장 으로 이 문 제 를 완벽 하 게 해결 했다.

#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
# MedusaSorcerer Script
import os

if __name__ == '__main__':
    file_path = 'medusa.md'
    with open(file_path, 'w') as f:
        print(f)
    os.remove(file_path)

with 문법 에서 뒤에 있 는 파일 을 열 고 되 돌아 오 는 파일 대상 을 f 변수 에 할당 하고 구조 체 에서 f 변수의 내용 을 출력 하 며 구조 체 외 에서 이 파일 을 삭 제 했 습 니 다.
medusa\python.exe medusa/main.py
<_io.TextIOWrapper name='medusa.md' mode='w' encoding='cp936'>
Process finished with exit code 0
close()를 사용 하지 않 은 상태 에서 도 파일 을 삭제 할 수 있 습 니 다.이것 이 바로 문맥 관리의 아름다움 입 니 다.
이루어지다
상하 문 관 리 는 사실상 를 실현 하 였 다enter__ 와exit__ 방법:

#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
# MedusaSorcerer Script


class Medusa:

    def __init__(self):
        print('__init__')

    def __enter__(self):
        print('__enter__')

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('__exit__')


if __name__ == '__main__':
    medusa = Medusa()
    with medusa:
        print('with object')
    print('finish')

다음은 출력 결과:
__init__
__enter__
with object
__exit__
finish
우 리 는 마법 방법 이 어떤 문법 을 결합 한 후에 자동 으로 스케줄 링 이 발생 하 는 것 을 발 견 했 기 때문에 상하 문 관리 에서 자동 스케줄 링 에서 일부 대상 을 닫 았 다.
장점.
상하 문 관 리 를 실현 하면 우리 의 코드 를 간소화 하고 코드 를 더욱 쉽게 읽 을 수 있 으 며 최소한 의 코드 를 사용 하면 모든 작업 을 완성 할 수 있다.
파 이 썬 컨 텍스트 관리자 Content Manager 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 컨 텍스트 관리자 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기