Bağlam Yöneticileri
Coddy'nin Python Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 41 / 64.
Bağlam yöneticileri, kaynakları tam olarak ihtiyaç duyulduğunda tahsis etmenize ve serbest bırakmanıza olanak tanır. Hatalar oluşsa bile düzgün bir temizlik yapılmasını sağlarlar.
İşte with ifadesini kullanan en yaygın örnek:
with open('example.txt', 'w') as file:
file.write('Hello, world!')
# Dosya burada otomatik olarak kapatılırDosya, bir istisna oluşsa bile bloktan sonra otomatik olarak kapatılır.
__enter__ ve __exit__ metotlarını uygulayarak kendi bağlam yöneticinizi oluşturun:
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 # İstisnaları bastırmayınÖzel bağlam yöneticinizi kullanın:
with MyContext() as ctx:
print("Inside the context")Çıktı:
Entering the context
Inside the context
Exiting the contextVeritabanı bağlantıları için daha pratik bir bağlam yöneticisi oluşturun:
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...")Bağlam yöneticilerinde istisnaları yönetme:
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 # İstisnayı bastırmayın
with SafeContext():
print("Working with resources")
# raise ValueError("Something went wrong") # Test etmek için yorum satırından çıkarınÇıktı:
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__exit__ metodu üç parametre alır:
exc_type: İstisna türü (veya None)exc_val: İstisna değeri (veya None)exc_tb: İstisna izleme (veya None)
Önemli Nokta: Bağlam yöneticileri (context managers), kaynakları yönetmek için __enter__ ve __exit__ metotlarını kullanır. with ifadesi bu metotları otomatik olarak çağırarak uygun kurulum ve temizleme işlemlerinin yapılmasını sağlar. Bu, özellikle dosyalar, veritabanı bağlantıları ve temizlenmesi garanti edilmesi gereken diğer kaynaklar için kullanışlıdır.
Görev
KolayBu meydan okumada, bir bağlam bloğuna giriş ve çıkış arasındaki geçen süreyi ölçen bir bağlam yöneticisi sınıfı uygulayacaksınız.
timer.py-Timersınıfı uygulamasını içerir (düzenleyeceğiniz dosya budur)driver.py- Kapsamlı test durumlarını içerir (değiştirmeyin)
timer.py dosyasındaki Timer bağlam yöneticisini TODO yorumlarını takip ederek uygulayın. Sınıf şunları yapmalıdır:
- Bir bağlama girerken başlangıç zamanını kaydetmeli
- Çıkarken bitiş zamanını kaydetmeli
- Geçen süreyi hesaplamalı ve görüntülemeli
Kopya kağıdı
Bağlam yöneticileri (context managers), kaynakları tam olarak ihtiyaç duyulduğunda tahsis eder ve serbest bırakır, hatalar oluşsa bile düzgün bir temizlik yapılmasını sağlar.
Otomatik kaynak yönetimi için with ifadesini kullanın:
with open('example.txt', 'w') as file:
file.write('Hello, world!')
# Dosya burada otomatik olarak kapatılır__enter__ ve __exit__ metotlarını uygulayarak özel bağlam yöneticileri oluşturun:
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 # İstisnaları bastırmayın
with MyContext() as ctx:
print("Inside the context")__exit__ metodu üç parametre alır:
exc_type: İstisna türü (veya None)exc_val: İstisna değeri (veya None)exc_tb: İstisna izleme (traceback) bilgisi (veya None)
Bağlam yöneticilerinde istisnaları yönetin:
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 # İstisnayı bastırmayınKendin dene
from timer import Timer
import time
# Test senaryosu işleyicisi
test_case = input()
if test_case == "basic_test":
# Temel işlevsellik testi
with Timer():
# Bir miktar işi simüle et
time.sleep(2) # Bu, programın 2 saniye beklemesini sağlar
elif test_case == "nested_contexts":
# İç içe geçmiş bağlam yöneticilerini test et
with Timer():
time.sleep(1)
with Timer():
time.sleep(1)
elif test_case == "exception_handling":
# Bağlam içindeki istisna yönetimini test et
try:
with Timer():
time.sleep(1)
raise ValueError("Test exception")
except ValueError as e:
print(f"Caught exception: {e}")
elif test_case == "zero_sleep":
# Minimum uyku ile test et
with Timer():
time.sleep(0.001)
elif test_case == "multiple_timers":
# Sıralı birden fazla zamanlayıcıyı test et
with Timer():
time.sleep(1)
with Timer():
time.sleep(0.5)
with Timer():
time.sleep(2)
elif test_case == "as_decorator":
# Bir fonksiyon bağlamında zamanlayıcıyı test et
def timed_function():
with Timer():
time.sleep(2)
timed_function()
else:
# Varsayılan test - temel işlevsellik
with Timer():
# Bir miktar işi simüle et
time.sleep(2) # Bu, programın 2 saniye beklemesini sağlar
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerself ParametresiMetotlarÖzniteliklerYapıcı Metot (__init__)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımsuper() FonksiyonuMetot Geçersiz KılmaÇoklu KalıtımMetot Çözümleme SırasıÖzet - Çalışan Hiyerarşisi7Özel Metotlar
Sihirli Metotlara GirişOperatör Aşırı YüklemeKapsayıcı Sihirli MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım kalıplarına girişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı13Final Meydan Okumaları
E-öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi5Çok Biçimlilik (Polymorphism)
Metot Geçersiz Kılmaya Yeniden BakışDuck TypingSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon ve KalıtımMixinsStatik ve Sınıf MetotlarıSınıf DekoratörleriBağlam Yöneticileri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı