0Pricing
Python Academy · Ders

Tanımlayıcılar: __get__, __set__, __delete__

Öznitelik erişim denetimi için tanımlayıcı protokolünü uygulayın.

Tanımlayıcılar: __get__, __set__, __delete__, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Python Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Python Academy kursu toplamda 4 dersten oluşur.

Tanımlayıcı Nedir?

Tanımlayıcı, __get__, __set__ veya __delete__ yöntemlerinden birini tanımlayan ve sınıf özniteliği olarak atanan bir nesnedir. Python, öznitelik erişimi sırasında bu yöntemleri çağırır.

class Descriptor:
    def __get__(self, obj, objtype=None):
        print(f"__get__ called, obj={obj}")
        return 42

class MyClass:
    attr = Descriptor()

print(MyClass().attr)   # __get__ called ... 42

Veri Tanımlayıcıları ve Veri Olmayan Tanımlayıcılar

Veri tanımlayıcıları, __set__ veya __delete__ yöntemini tanımlar ve örneğin __dict__ özniteliğine göre önceliklidir. Veri olmayan tanımlayıcılar (yalnızca __get__ yöntemini tanımlayanlar) __dict__ özniteliğine öncelik verir.

class DataDesc:
    def __get__(self, obj, t): return "data"
    def __set__(self, obj, val): pass

class NonDataDesc:
    def __get__(self, obj, t): return "nondata"

class C:
    d = DataDesc()
    n = NonDataDesc()

c = C()
c.__dict__["n"] = "instance"  # shadows the non-data desc
c.__dict__["d"] = "instance"  # does NOT shadow data desc
print(c.n)   # instance
print(c.d)   # data

__get__ İmzası

__get__(self, obj, objtype): obj örnektir (sınıf üzerinden erişildiğinde None olur); objtype ise sınıftır.

class Verbose:
    def __get__(self, obj, objtype=None):
        if obj is None:
            return self   # accessed on class
        return f"value for {obj!r}"

class Widget:
    label = Verbose()

print(Widget.label)        # <Verbose object>
print(Widget().label)      # value for <Widget object>

__set__ ve Doğrulama

Bir değeri depolamadan önce doğrulamak veya dönüştürmek için __set__(self, obj, value) yöntemini uygulayın.

class PositiveInt:
    def __set_name__(self, owner, name):
        self.name = name

    def __get__(self, obj, t):
        return obj.__dict__.get(self.name)

    def __set__(self, obj, val):
        if not isinstance(val, int) or val <= 0:
            raise ValueError(f"{self.name} must be a positive int")
        obj.__dict__[self.name] = val

class Rect:
    width  = PositiveInt()
    height = PositiveInt()

r = Rect()
r.width = 10
# r.width = -1  # ValueError

__set_name__

Python 3.6 ve sonraki sürümler, tanımlayıcı bir sınıfa atandığında tanımlayıcı üzerinde __set_name__(owner, name) yöntemini çağırır; böylece tanımlayıcı kendi öznitelik adını öğrenebilir.

class Typed:
    def __set_name__(self, owner, name):
        self.public  = name
        self.private = "_" + name

    def __get__(self, obj, t):
        return None if obj is None else getattr(obj, self.private, None)

    def __set__(self, obj, val):
        setattr(obj, self.private, val)

class User:
    name = Typed()

u = User()
u.name = "Alice"
print(u.name)     # Alice

Öznitelik Kaldırma için __delete__

del obj.attr işlemini araya girerek denetlemek için __delete__(self, obj) yöntemini tanımlayın.

class Protected:
    def __set_name__(self, owner, name): self.name = name
    def __get__(self, obj, t):
        return obj.__dict__.get(self.name)
    def __set__(self, obj, v): obj.__dict__[self.name] = v
    def __delete__(self, obj):
        raise AttributeError(f"Cannot delete {self.name}")

class Config:
    host = Protected()

c = Config(); c.host = "localhost"
# del c.host   # AttributeError

İşlevler Veri Olmayan Tanımlayıcılardır

İşlevler, bir örnek üzerinden erişildiğinde bağlı bir yöntem döndürmek için __get__ yöntemini uygular. Python'daki yöntem bağlama işlemi bu şekilde çalışır.

def greet(self):
    return f"Hello from {self}"

class C: pass
C.greet = greet

c = C()
print(c.greet())    # Hello from <C object>

classmethod ve staticmethod Tanımlayıcılardır

classmethod ve staticmethod, işlevleri saran ve __get__ yönteminin dönüş değerini değiştiren yerleşik tanımlayıcı sınıflarıdır.

class MyClass:
    @classmethod
    def from_string(cls, s):
        return cls()

# classmethod.__get__ returns a bound method with cls
# staticmethod.__get__ returns the plain function

Tembel Öznitelik Tanımlayıcısı

Bir değeri yalnızca bir kez hesaplayan ve bu değeri örnek başına önbelleğe alan bir tanımlayıcı oluşturun.

class LazyAttr:
    def __init__(self, func): self.func = func
    def __set_name__(self, owner, name): self.name = name
    def __get__(self, obj, t):
        if obj is None: return self
        val = self.func(obj)
        obj.__dict__[self.name] = val   # shadows descriptor
        return val

class Report:
    @LazyAttr
    def summary(self):
        print("computing...")
        return "done"

r = Report()
print(r.summary)   # computing... done
print(r.summary)   # done (cached)

property Bir Tanımlayıcıdır

property, C ile uygulanmış bir veri tanımlayıcısıdır. Tanımlayıcıları anlamak, @property, @classmethod ve @staticmethod yapılarının tümünün nasıl çalıştığını anlamanıza yardımcı olur.

class Circle:
    def __init__(self, r): self._r = r

    @property
    def radius(self): return self._r

    @radius.setter
    def radius(self, v):
        if v < 0: raise ValueError
        self._r = v

# property is: property.__get__ = fget, property.__set__ = fset

Tanımlayıcı Arama Sırası

Python öznitelik arama sırası: 1) türün MRO içindeki veri tanımlayıcıları, 2) örneğin __dict__ sözlüğü, 3) veri olmayan tanımlayıcılar ve sınıf değişkenleri.

# Pseudocode for obj.attr:
# 1. Check type(obj).__mro__ for a data descriptor
# 2. Check obj.__dict__
# 3. Check type(obj).__mro__ for non-data descriptor or class var
# 4. Raise AttributeError

Hızlı Kontrol

Örneğin __dict__ sözlüğüne göre öncelikli olan tanımlayıcı türü hangisidir?

Özet

Tanımlayıcılar, öznitelik erişimine __get__, __set__ ve __delete__ aracılığıyla müdahale eder. Veri tanımlayıcıları örneğin __dict__ sözlüğünü gölgeler; veri olmayan tanımlayıcılar bunu yapmaz. Öznitelik adını öğrenmek için __set_name__ kullanın. property, classmethod ve staticmethod tanımlayıcıdır.

Sıkça Sorulan Sorular

“Tanımlayıcılar: __get__, __set__, __delete__” dersi ücretsiz mi?

Evet — “Tanımlayıcılar: __get__, __set__, __delete__” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Python Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Python Academy kursu toplamda 4 dersten oluşur.

“Tanımlayıcılar: __get__, __set__, __delete__” dersinde ne öğreneceğim?

Öznitelik erişim denetimi için tanımlayıcı protokolünü uygulayın. Python Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Python Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Python Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Tanımlayıcılar: __get__, __set__, __delete__” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Python Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Python Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Python Sınıfları Nasıl Oluşturulur
  2. Özel Üst Sınıflar Yazma
  3. Tanımlayıcılar: __get__, __set__, __delete__
  4. __slots__ ve Bellek Optimizasyonu
← Python Academy Sayfasına Dön