2013-01-06 14 views
8

Jak używać menedżera kontekstu dla zmiennych instancji? Na przykład. Załóżmy, że mam klasę Connection, która musi zostać zamknięta po zniszczeniu. Gdybym miał go zaimplementować jako ContextManager, mógłbym to zrobić.Jak używać kontekstMagentów dla zmiennych instancji

with Connection() as c: 
    c.write('FOO') 
    c.ask('BAR?') 

i zostanie automatycznie zamknięty po zniszczeniu. Ale co jeśli chciałbym go użyć w innej klasie, np. __init__? jak w poniższym przykładzie?

class Device(object): 
    def __init__(self): 
     self.connection = Connection() # Must be closed on destruction. 

I nie ma to być zamknięte na wyjściu z konstruktora, powinien umrzeć, gdy obiekt get zniszczone. Mogę użyć __del__, ale ma to wady. Przyzwyczajenie się do RAII w C++ mnie niepokoi.

Jaki jest najlepszy sposób w tym przypadku?

+2

Czas niszczenia obiektów nigdy nie jest właściwym czasem na wszystko, szczególnie w przypadku zarządzania zasobami. Zapomnij, że istnieje coś takiego jak zbieranie śmieci i zakładaj, że wszystkie obiekty żyją w nieskończoność. – delnan

Odpowiedz

6

Powinieneś wywołać self.connection.close w swojej metodzie Device.close(), a następnie ustawić, aby to było poprawnie wywoływane w twoim programie, być może z menedżerem kontekstu.

__del__ nigdy nie jest tego warta.

1
from contextlib import contextmanager 

@contextmanager 
def connection(): 
    conn = Conn() 
    try: 
     yield conn 
    finally: 
     conn.close() 

class Conn(object): 
    def close(self): 
     print('Closing') 

class Device(object): 
    def __init__(self, conn): 
     self.conn = Conn() 

with connection() as conn: 
    d = Device(conn) 
Powiązane problemy