Menu
CoddyTech

Pengelola Konteks

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Python di Coddy. Pelajaran 41 dari 64.

Context manager memungkinkan kamu mengalokasikan dan melepaskan resource tepat saat dibutuhkan. Context manager memastikan pembersihan yang tepat bahkan jika terjadi error.

Berikut contoh yang paling umum menggunakan pernyataan with:

with open('example.txt', 'w') as file:
    file.write('Hello, world!')
# File ditutup secara otomatis di sini

File akan ditutup secara otomatis setelah blok, bahkan jika terjadi pengecualian.

Buat context manager-mu sendiri dengan mengimplementasikan method __enter__ dan __exit__:

class MyContext:
    def __enter__(self):
        print("Entering the context")
        return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        print("Exiting the context")
        return False  # Jangan cegah pengecualian muncul

Gunakan pengelola konteks kustommu:

with MyContext() as ctx:
    print("Inside the context")

Output:

Entering the context
Inside the context
Exiting the context

Buat pengelola konteks yang lebih praktis untuk koneksi database:

class DatabaseConnection:
    def __init__(self, db_name):
        self.db_name = db_name
        self.connection = None
    
    def __enter__(self):
        print(f"Connecting to {self.db_name}")
        self.connection = f"Connection to {self.db_name}"
        return self.connection
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        print(f"Closing connection to {self.db_name}")
        self.connection = None

with DatabaseConnection("users_db") as conn:
    print(f"Using {conn}")
    print("Performing database operations...")

Menangani pengecualian dalam pengelola konteks:

class SafeContext:
    def __enter__(self):
        print("Setting up resources")
        return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        print("Cleaning up resources")
        if exc_type:
            print(f"An exception occurred: {exc_val}")
        return False  # Jangan abaikan pengecualian

with SafeContext():
    print("Working with resources")
    # raise ValueError("Something went wrong")  # Hapus tanda komentar untuk menguji

Output:

Connecting to users_db
Using Connection to users_db
Performing database operations...
Closing connection to users_db
Setting up resources
Working with resources
Cleaning up resources

Method __exit__ menerima tiga parameter:

  • exc_type: tipe Exception (atau None)
  • exc_val: nilai Exception (atau None)
  • exc_tb: traceback Exception (atau None)

Poin Utama: Context manager menggunakan method __enter__ dan __exit__ untuk mengelola resource. Pernyataan with secara otomatis memanggil method ini, sehingga penyiapan dan pembersihan dilakukan dengan benar. Ini sangat berguna untuk file, koneksi database, dan resource lain yang perlu dibersihkan dengan pasti.

challenge icon

Tantangan

Mudah

Dalam tantangan ini, kamu akan mengimplementasikan class context manager yang mengukur waktu yang berlalu antara saat memasuki dan keluar dari blok context.

  • timer.py - Berisi implementasi class Timer (file ini yang akan kamu edit)
  • driver.py - Berisi kasus uji yang lengkap (jangan diubah)

Implementasikan context manager Timer di timer.py dengan mengikuti komentar TODO. Class ini harus:

  1. Mencatat waktu mulai saat memasuki context
  2. Mencatat waktu berakhir saat keluar
  3. Menghitung dan menampilkan waktu yang berlalu

Coba sendiri

from timer import Timer
import time

# Penangan kasus uji
test_case = input()

if test_case == "basic_test":
    # Uji fungsi dasar
    with Timer():
        # Simulasikan beberapa pekerjaan
        time.sleep(2)  # Ini membuat programmu menunggu selama 2 detik

elif test_case == "nested_contexts":
    # Uji pengelola konteks bersarang
    with Timer():
        time.sleep(1)
        with Timer():
            time.sleep(1)

elif test_case == "exception_handling":
    # Uji penanganan pengecualian di dalam konteks
    try:
        with Timer():
            time.sleep(1)
            raise ValueError("Test exception")
    except ValueError as e:
        print(f"Caught exception: {e}")

elif test_case == "zero_sleep":
    # Uji dengan waktu tunggu minimal
    with Timer():
        time.sleep(0.001)

elif test_case == "multiple_timers":
    # Uji beberapa timer secara berurutan
    with Timer():
        time.sleep(1)
    
    with Timer():
        time.sleep(0.5)
    
    with Timer():
        time.sleep(2)

elif test_case == "as_decorator":
    # Uji timer dalam konteks fungsi
    def timed_function():
        with Timer():
            time.sleep(2)
    
    timed_function()

else:
    # Uji bawaan: fungsi dasar
    with Timer():
        # Simulasikan beberapa pekerjaan
        time.sleep(2)  # Ini membuat programmu menunggu selama 2 detik
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Python online