Come deve essere gestito un gestore di contesto in un altro gestore di contesto in Python?Gestione di istanze di un gestore di contesto in un altro gestore di contesto
Esempio: si supponga di avere la classe A
che funge da gestore contesto e la classe B
che funge anche da gestore contesto. Ma le istanze della classe B
dovranno istanziare e utilizzare un'istanza della classe A
. Ho seguito PEP 343 e questa è la soluzione che ho pensato:
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)
È questo l'approccio corretto? O mi mancano alcuni trucchi?
Interessante. Potrebbe funzionare anche Lo svantaggio di questo è che l'utente della nostra classe 'B' dovrà creare l'istanza di' A' e passarla a noi. Inoltre, diventerebbe sempre più complicato se la catena dei requisiti fosse più profonda di un livello. Ma buona idea per casi semplici. Grazie. – Sahand
@NoctisSkytower Il tuo approccio basato sulla classe è praticabile solo se ha davvero senso che B sia una sottoclasse di A. IMO che la relazione non dovrebbe essere creata rigorosamente per renderli più semplici come gestori di contesto, poiché viola il " IS-A "principio di programmazione OO. – dano
Sono d'accordo con @dano. Se logicamente ha senso che 'B' sia una sottoclasse di' A', questa è un'ottima soluzione. Il mio esempio sopra è semplificato. Nel mio caso d'uso effettivo, è la stessa classe che ha riferimenti a istanze di sé in modo ricorsivo (un po 'come una lista concatenata), e quindi tutti devono essere rilasciati in modo ricorsivo. L'idea dell'eredità non funzionerebbe lì. – Sahand