다른 컨텍스트 관리자 내부에서 작성된 컨텍스트 관리자는 어떻게 파이썬에서 처리해야합니까?다른 컨텍스트 관리자 내부의 컨텍스트 관리자 인스턴스 처리
예 : 컨텍스트 관리자 역할을하는 A
클래스와 컨텍스트 관리자 역할을하는 B
클래스가 있다고 가정합니다. 그러나 클래스 B
인스턴스는 인스턴스화하고 클래스 A
의 인스턴스를 사용해야합니다. 저는 PEP 343을 생각해 봤는데 이것이 제가 생각한 해결책입니다 :
class A(object):
def __enter__(self):
# Acquire some resources here
return self
def __exit__(seplf, exception_type, exception, traceback):
# Release the resources and clean up
pass
class B(object):
def __init__(self):
self.a = A()
def __enter__(self):
# Acquire some resources, but also need to "start" our instance of A
self.a.__enter__()
return self
def __exit__(self, exception_type, exception, traceback):
# Release the resources, and make our instance of A clean up as well
self.a.__exit__(exception_type, exception, traceback)
올바른 방법입니까? 아니면 내가 몇 가지 잡았을까?
재미있는합니다. 그것도 작동 할 수 있습니다. 이것의 단점은'B' 클래스의 사용자가'A'의 인스턴스를 만들어서 우리에게 넘겨 주어야한다는 것입니다. 또한 요구 사슬이 한 레벨 이상 깊어지면 점점 더 복잡해질 것입니다. 그러나 간단한 경우에는 좋은 아이디어입니다. 고맙습니다. – Sahand
@NoctisSkytower 클래스 기반 접근 방식은 B가 A. 하위 클래스가되는 것이 실제로 의미가있는 경우에만 실행 가능합니다. IMO는 컨텍스트 관리자로 중첩되도록 엄격하게 생성해서는 안되며, IS-A "OO 프로그래밍 원칙을 준수해야합니다. – dano
나는 @dano에 동의한다. 논리적으로'B'가'A'의 하위 클래스라는 것이 합리적이라면 이것은 아주 좋은 해결책입니다. 위의 예는 지나치게 단순화 된 것입니다. 내 실제 사용 케이스에서 그것은 반복적으로 (연결된 목록과 같이) 자체적으로 인스턴스에 대한 참조를 갖는 동일한 클래스이므로 모두 재귀 적으로 릴리스해야합니다. 상속 아이디어는 거기서 작동하지 않습니다. – Sahand