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
'itsource' 카테고리의 다른 글
도커가 도커 데몬에 연결할 수 없음 (0) | 2023.08.15 |
---|---|
Nuget에서 "실행 중인 스크립트가 사용되지 않도록 설정되었기 때문에 ps1을 로드할 수 없습니다."라는 오류 메시지를 표시합니다. (0) | 2023.08.10 |
배열을 매개 변수로 다른 스크립트에 전달하려면 어떻게 해야 합니까? (0) | 2023.08.10 |
프로그래밍 방식으로 Excel 사용자 정의 문서 속성 액세스 (0) | 2023.08.10 |
로컬 네트워크의 장치에서 webpack-dev-server에 액세스하는 방법은 무엇입니까? (0) | 2023.08.10 |