Python Academy · पाठ

डिस्क्रिप्टर: __get__, __set__, __delete__

एट्रिब्यूट पहुँच नियंत्रण के लिए डिस्क्रिप्टर प्रोटोकॉल लागू करें।

पाठ 3, कुल 4 में से13 चरण

डिस्क्रिप्टर: __get__, __set__, __delete__, CoddyKit पर Python Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Python Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

डिस्क्रिप्टर क्या है?

डिस्क्रिप्टर वह ऑब्जेक्ट है जो __get__, __set__ या __delete__ को परिभाषित करता है और क्लास की विशेषता के रूप में असाइन किया जाता है। विशेषता तक पहुँचने पर Python इन विधियों को कॉल करता है।

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

डेटा बनाम गैर-डेटा डिस्क्रिप्टर

डेटा डिस्क्रिप्टर __set__ या __delete__ को परिभाषित करते हैं और इंस्टेंस के __dict__ से पहले प्राथमिकता पाते हैं। गैर-डेटा डिस्क्रिप्टर (जिनमें केवल __get__ होता है) __dict__ को प्राथमिकता देते हैं।

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__ हस्ताक्षर

__get__(self, obj, objtype): obj इंस्टेंस है, या क्लास पर पहुँचने पर None है; objtype क्लास है।

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__ और सत्यापन

किसी मान को संग्रहीत करने से पहले उसका सत्यापन या रूपांतरण करने के लिए __set__(self, obj, value) लागू करें।

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+ उस पर __set_name__(owner, name) को कॉल करता है और उसे अपनी विशेषता का नाम जानने की सुविधा देता है।

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

विशेषता हटाने के लिए __delete__

del obj.attr को बीच में रोकने के लिए __delete__(self, obj) परिभाषित करें।

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

फ़ंक्शन गैर-डेटा डिस्क्रिप्टर होते हैं

इंस्टेंस पर पहुँचने पर बाउंड विधि लौटाने के लिए फ़ंक्शन __get__ लागू करते हैं। Python में विधि बाइंडिंग इसी तरह काम करती है।

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

class C: pass
C.greet = greet

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

classmethod और staticmethod डिस्क्रिप्टर हैं

classmethod और staticmethod अंतर्निर्मित डिस्क्रिप्टर क्लासें हैं, जो फ़ंक्शन को लपेटती हैं और __get__ के लौटाए गए मान को बदलती हैं।

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

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

विलंबित विशेषता डिस्क्रिप्टर

ऐसा डिस्क्रिप्टर बनाएँ जो किसी मान की गणना एक बार करे और उसे प्रत्येक इंस्टेंस के लिए कैश करे।

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 एक डिस्क्रिप्टर है

property स्वयं C में लागू किया गया डेटा डिस्क्रिप्टर है। डिस्क्रिप्टर को समझने से आपको यह समझने में सहायता मिलती है कि @property, @classmethod और @staticmethod सभी कैसे काम करते हैं।

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

डिस्क्रिप्टर खोज क्रम

पाइथन में एट्रिब्यूट खोज का क्रम: 1) टाइप (MRO) से डेटा डिस्क्रिप्टर, 2) इंस्टेंस __dict__, 3) गैर-डेटा डिस्क्रिप्टर और क्लास चर।

# 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

त्वरित जाँच

किस प्रकार का डिस्क्रिप्टर इंस्टेंस __dict__ पर प्राथमिकता पाता है?

पुनरावलोकन

डिस्क्रिप्टर __get__, __set__, __delete__ के माध्यम से एट्रिब्यूट एक्सेस को बीच में नियंत्रित करते हैं। डेटा डिस्क्रिप्टर इंस्टेंस के __dict__ को छिपा देते हैं; गैर-डेटा डिस्क्रिप्टर ऐसा नहीं करते। एट्रिब्यूट का नाम जानने के लिए __set_name__ का उपयोग करें। property, classmethod और staticmethod सभी डिस्क्रिप्टर हैं।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Python सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
76
पाठ
320

अक्सर पूछे जाने वाले प्रश्न

क्या “डिस्क्रिप्टर: __get__, __set__, __delete__” पाठ निःशुल्क है?

हाँ—“डिस्क्रिप्टर: __get__, __set__, __delete__” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Python Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“डिस्क्रिप्टर: __get__, __set__, __delete__” में मैं क्या सीखूँगा?

एट्रिब्यूट पहुँच नियंत्रण के लिए डिस्क्रिप्टर प्रोटोकॉल लागू करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Python Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Python Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Python Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“डिस्क्रिप्टर: __get__, __set__, __delete__” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Python Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Python Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Python क्लास कैसे बनाई जाती हैं
  2. कस्टम मेटाक्लास लिखना
  3. डिस्क्रिप्टर: __get__, __set__, __delete__
  4. __slots__ और मेमोरी अनुकूलन
← Python Academy पर वापस जाएँ