Fungování je jednoduché: třída implementuje metody __enter__() a __exit__(), při vyhodnocování výrazu v konstrukci with se zavolá __enter__(), při ukončení těla bloku (i v případě vyvolání výjimky, stejně jako u finally:) se zavolá __exit__(). Takže Lock v __enter__() zavolá self.acquire(), v __exit__() je self.release() a je vymalováno.