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 siniFile 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 munculGunakan pengelola konteks kustommu:
with MyContext() as ctx:
print("Inside the context")Output:
Entering the context
Inside the context
Exiting the contextBuat 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 mengujiOutput:
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 resourcesMethod __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.
Tantangan
MudahDalam 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 classTimer(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:
- Mencatat waktu mulai saat memasuki context
- Mencatat waktu berakhir saat keluar
- 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
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPclass vs objectParameter selfmethodAtributMethod Konstruktor (__init__)Rangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan DasarFungsi super()Penimpaan MethodPewarisan BergandaUrutan Resolusi MethodRingkasan: Hierarki Karyawan5Polimorfisme
Meninjau Ulang Method OverridingDuck Typingclass dan method AbstrakDesain InterfaceRingkasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanMixinsMetode Statis dan Metode ClassDecorator ClassPengelola Konteks11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola Composite3Property class
Variabel instance vs variabel classDekorator propertyAtribut privatRangkuman: Pengelola Rekening Bank6Enkapsulasi
Anggota Public, Protected, PrivateModifier AksesPenyembunyian InformasiDecorator Property Tingkat LanjutUlasan: Sistem Catatan Siswa12Proyek: Manajemen Perpustakaan
Ikhtisar Proyekclass Buku dan PenggunaSistem PeminjamanFitur PencarianAntarmuka AdminPengujian dan IntegrasiLatihan sendiri: Compiler Python online