Menu
Coddy logo textTech

Bağlam Yöneticileri

Coddy'nin Python Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 41 / 64.

Bağlam yöneticileri, kaynakları tam olarak gerektiğinde ayırmanıza ve serbest bırakmanıza olanak tanır. Hatalar meydana gelse bile uygun temizleme işleminin yapılmasını sağlarlar.

İşte with ifadesinin kullanıldığı en yaygın örnek:

with open('example.txt', 'w') as file:
    file.write('Hello, world!')
# Dosya burada otomatik olarak kapatılır

Dosya, bir istisna oluşsa bile bloktan sonra otomatik olarak kapatılır.

__enter__ ve __exit__ yöntemlerini 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ırma

Özel bağlam yöneticinizi kullanın:

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

Çıktı:

Entering the context
Inside the context
Exiting the context

Veritabanı 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öneticilerindeki 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ırma

with SafeContext():
    print("Working with resources")
    # raise ValueError("Something went wrong")  # Test etmek için yorum satırını kaldır

Çı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: Özel durum türü (veya None)
  • exc_val: Özel durum değeri (veya None)
  • exc_tb: Özel durum geri izleme bilgisi (veya None)

Önemli Nokta: Bağlam yöneticileri, kaynakları yönetmek için __enter__ ve __exit__ yöntemlerini kullanır. with ifadesi bu yöntemleri otomatik olarak çağırarak kurulumun ve temizleme işleminin düzgün şekilde yapılmasını sağlar. Bu, özellikle dosyalar, veritabanı bağlantıları ve temizleme işleminin garanti edilmesi gereken diğer kaynaklar için kullanışlıdır.

challenge icon

Görev

Kolay

Bu görevde, bir bağlam bloğuna girme ve çıkma arasındaki geçen süreyi ölçen bir bağlam yöneticisi sınıfı uygulayacaksınız.

  • timer.py - Timer sınıfı uygulamasını içerir (düzenleyeceğiniz dosya budur)
  • driver.py - Kapsamlı test senaryolarını içerir (değiştirmeyin)

timer.py içindeki Timer bağlam yöneticisini TODO yorumlarını izleyerek uygulayın. Sınıf şunları yapmalıdır:

  1. Bir bağlama girerken başlangıç zamanını kaydetmek
  2. Çıkarken bitiş zamanını kaydetmek
  3. Geçen süreyi hesaplamak ve görüntülemek

Kendin dene

from timer import Timer
import time

# Test durumu işleyicisi
test_case = input()

if test_case == "basic_test":
    # Temel işlevsellik testi
    with Timer():
        # Biraz iş simüle et
        time.sleep(2)  # Bu, programın 2 saniye beklemesini sağlar

elif test_case == "nested_contexts":
    # İç içe bağlam yöneticilerini test et
    with Timer():
        time.sleep(1)
        with Timer():
            time.sleep(1)

elif test_case == "exception_handling":
    # Bağlam içinde istisna işlemeyi 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":
    # Minimal uyku ile test et
    with Timer():
        time.sleep(0.001)

elif test_case == "multiple_timers":
    # Sırayla 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():
        # Biraz iş simüle et
        time.sleep(2)  # Bu, programın 2 saniye beklemesini sağlar
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Python derleyicisi