Özelleştirilmiş Öznitelik Erişimi

Python'da Orta Düzey Nesne Yönelimli Programlama

Jake Roach

Data Engineer

AttributeError

class Student:
  def __init__(self, student_name, major):
    self.student_name = student_name
    self.major = major
...
karina = Student("Karina", "Literature")
student.residence_hall  # Var olmayan bir özniteliğe erişmeyi deneyin
...
AttributeError: 'Student' object has no attribute 'residence_hall'
Python'da Orta Düzey Nesne Yönelimli Programlama

__getattr__()

# Yukarıdaki sınıf tanımının devamı

  def __getattr__(self, name):
    # Mantığı burada uygulayın
    ...

Bir nesnenin ad alanı, o nesneyle ilişkili özniteliklerin kümesidir

__getattr__() bir nesnenin ad alanı DIŞINDAKİ HERHANGİ bir özniteliğe erişme girişiminde çalışır

  • Sihirli metot, doğrudan çağrılmaz
  • name parametresi alır
  • AttributeError fırlatmak yerine özel işlev sunar
Python'da Orta Düzey Nesne Yönelimli Programlama

AttributeError’ı giderme

class Student:
  def __init__(self, student_name, major):
    self.student_name = student_name
    self.major = major

  def __getattr__(self, name):
      print(f"""{name} does not exist in this object's namespace, try setting 
            a value for {name} first""")
karina.residence_hall  # Şimdi residence_hall özniteliğini yeniden almaya çalışın
residence_hall does not exist in this object's namespace, try setting a value for 
  residence_hall first
Python'da Orta Düzey Nesne Yönelimli Programlama

__setattr__()

__setattr__(), bir (yeni veya mevcut) öznitelik AYARLANDIĞINDA veya GÜNCELLENDİĞİNDE çalışır

  • __init__() ile ayarlananları da kapsar
  • Özniteliğin name ve value değerlerini alır
  • Nesnenin __dict__ özniteliğinden yararlanır

$$

$$

Öznitelik değişimlerini denetleme, doğrulama, dönüştürme

# Yukarıdaki sınıf tanımının devamı

  def __setattr__(self, name, value):
    # Mantığı burada uygulayın
    ...

    # Özniteliği oluşturmak/güncellemek için 
    # __dict__ kullanın
    self.__dict__[name] = value

__dict__ nesnenin tüm özniteliklerini saklar; veriyi almak ve depolamak için kullanılabilir

Python'da Orta Düzey Nesne Yönelimli Programlama

Öznitelik depolamayı özelleştirme

class Student:
  def __init__(self, student_name, major):
    self.student_name = student_name
    self.major = major

  def __setattr__(self, name, value):
    # If value is a string, set the attribute using the __dict__ attribute
    if isinstance(value, str):
      print(f"Setting {name} = {value}")
      self.__dict__[name] = value

    else: # Otherwise, raise an exception noting an incorrect data type
        raise Exception("Unexpected data type!")
Python'da Orta Düzey Nesne Yönelimli Programlama

__setattr__ uygulamada

# 'str' türünde bir değerle öznitelik ayarlayın
karina.residence_hall = "Honors College South"
print(karina.residence_hall)
Setting residence_hall = Honors College South
Honors College South
# 'int' türünde bir değerle öznitelik ayarlayın
karina.student_id = 19301872
...
    raise Exception("Unexpected data type!")
Exception: Unexpected data type!
Python'da Orta Düzey Nesne Yönelimli Programlama

__getattr__ ve __setattr__ birlikte kullanımı

class Student:
    ...   

    def __getattr__(self, name):
        # Yer tutucu ile öznitelik ayarlayın
        self.__setattr__(name, None)
        return None

    def __setattr__(self, name, value):
        if value is None:  # Yer tutucu ayarlandığını bildirin
            print(f"Setting placeholder for {name}")

        self.__dict__[name] = value  # Özniteliği ayarlayın
Python'da Orta Düzey Nesne Yönelimli Programlama

Passons à la pratique !

Python'da Orta Düzey Nesne Yönelimli Programlama

Preparing Video For Download...