itsource

python의 사용자 지정 클래스에서 'with object() as f' 사용 구현

mycopycode 2023. 8. 10. 18:48
반응형

python의 사용자 지정 클래스에서 'with object() as f' 사용 구현

저는 python에서 파일과 같은 객체(/dev/를 통한 직렬 연결)를 열고 닫아야 합니다.이것은 우리 반의 여러 가지 방법으로 여러 번 행해집니다.제가 어떻게 했는지는 생성자에서 파일을 열고, 파괴자에서 파일을 닫는 것이었습니다.하지만 이상한 오류가 발생하고 있고 쓰레기 수집기 등과 관련이 있는 것 같아요, 제 물건들이 언제 삭제되는지 아직 정확히 모르는 것에 익숙하지 않아요 =\

제가 이걸 한 이유는 제가 사용해야 하기 때문입니다.tcsetattr열 때마다 변수가 잔뜩 들어 있어서 여기저기서 하는 게 짜증나요.그래서 저는 그 모든 것을 처리할 수 있는 내부 수업을 구현하고 싶습니다. 그래서 저는 그것을 사용할 수 있습니다.
with Meter('/dev/ttyS2') as m:

인터넷을 보고 있었는데 어떻게 하면 좋을지 정말 좋은 답을 찾을 수 없었습니다.with구문이 구현되었습니다.나는 그것이 사용하는 것을 보았습니다.__enter__(self)그리고.__exit(self)__방법들.하지만 제가 그 방법들을 구현하기만 하면 되고 구문과 함께 를 사용할 수 있습니까?아니면 더 많은 것이 있습니까?

이 작업을 수행하는 방법에 대한 예나 파일 개체에 이미 구현된 방법에 대한 설명서가 있습니까?

이러한 방법은 객체를 작동시키는 데 필요한 거의 모든 것입니다.with진술.

__enter__파일 객체를 열고 설정한 후 반환해야 합니다.

__exit__파일 개체를 닫아야 합니다.여기에 쓰기 위한 코드는 다음에 있을 것입니다.with문 본문

class Meter():
    def __init__(self, dev):
        self.dev = dev
    def __enter__(self):
        #ttysetattr etc goes here before opening and returning the file object
        self.fd = open(self.dev, MODE)
        return self
    def __exit__(self, type, value, traceback):
        #Exception handling here
        close(self.fd)

meter = Meter('dev/tty0')
with meter as m:
    #here you work with the file object.
    m.fd.read()

가장 쉬운 방법은 표준 Python 라이브러리 모듈 contextlib를 사용하는 것입니다.

import contextlib

@contextlib.contextmanager
def themeter(name):
    theobj = Meter(name)
    try:
        yield theobj
    finally:
        theobj.close()  # or whatever you need to do at exit


# usage
with themeter('/dev/ttyS2') as m:
    # do what you need with m
    m.read()

이건 말도 안 돼요Meter그 자체가 컨텍스트 관리자(따라서 해당 클래스에 비침습적임)이지만 오히려 "장식"합니다(파이썬의 "장식자 구문"의 의미가 아니라 장식자 디자인 패턴의 의미에서 거의, 그러나 완전히는 아님). 팩토리 기능을 갖춘themeter이것은 상황 관리자입니다 (그것은.contextlib.contextmanager장식가는 "싱글-"로 지어집니다.yield작성한 생성기 함수) -- 이렇게 하면 진입 조건과 종료 조건을 훨씬 쉽게 분리할 수 있으며 중첩 및 &c를 피할 수 있습니다.

구글의 첫 번째 히트작은 (나에게) 충분히 간단하게 설명합니다.

http://effbot.org/zone/python-with-statement.htm

그리고 PEP는 이를 더 정확하게(그러나 더 상세하게) 설명합니다.

http://www.python.org/dev/peps/pep-0343/

언급URL : https://stackoverflow.com/questions/3774328/implementing-use-of-with-object-as-f-in-custom-class-in-python

반응형