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 ... 42Veri 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 functionTembel Ö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__ = fsetTanı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 AttributeErrorHı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
- Python Sınıfları Nasıl Oluşturulur
- Özel Üst Sınıflar Yazma
- Tanımlayıcılar: __get__, __set__, __delete__
- __slots__ ve Bellek Optimizasyonu