खोज…


टिप्पणियों

नोट : पायथन 2 में, सुनिश्चित करें कि उपलब्ध होने वाली सभी विशेषताओं के लिए आपकी कक्षा ऑब्जेक्ट से विरासत में मिली (इसे एक नई शैली की कक्षा बना रही है)।

@Property डेकोरेटर का उपयोग करना

@property डेकोरेटर का उपयोग उन वर्गों में विधियों को परिभाषित करने के लिए किया जा सकता है जो विशेषताओं की तरह काम करते हैं। एक उदाहरण जहां यह उपयोगी हो सकता है, वह है जब उस जानकारी को उजागर करना जिसके लिए प्रारंभिक (महंगी) लुकअप और उसके बाद सरल पुनर्प्राप्ति की आवश्यकता हो सकती है।

कुछ मॉड्यूल foobar.py को देखते हुए:

class Foo(object):
    def __init__(self):
        self.__bar = None

    @property
    def bar(self):
        if self.__bar is None:
            self.__bar = some_expensive_lookup_operation()
        return self.__bar

फिर

>>> from foobar import Foo
>>> foo = Foo()
>>> print(foo.bar)  # This will take some time since bar is None after initialization
42
>>> print(foo.bar)  # This is much faster since bar has a value now
42

पढ़ने-लिखने के गुणों के लिए @property डेकोरेटर का उपयोग करना

यदि आप सेटिंग और प्राप्त करने के लिए कस्टम व्यवहार को लागू करने के लिए @property का उपयोग करना चाहते हैं, तो इस पैटर्न का उपयोग करें:

class Cash(object):
    def __init__(self, value):
        self.value = value
    @property
    def formatted(self):
        return '${:.2f}'.format(self.value)
    @formatted.setter
    def formatted(self, new):
        self.value = float(new[1:])

इसका उपयोग करने के लिए:

>>> wallet = Cash(2.50)
>>> print(wallet.formatted)
$2.50
>>> print(wallet.value)
2.5
>>> wallet.formatted = '$123.45'
>>> print(wallet.formatted)
$123.45
>>> print(wallet.value)
123.45

बस एक गेट्टर, सेटर या प्रॉपर्टी ऑब्जेक्ट को हटाने का काम करना

जब आप किसी प्रॉपर्टी के साथ वर्ग से विरासत में आते हैं, तो आप मूल वर्ग पर प्रॉपर्टी ऑब्जेक्ट को संदर्भित करके एक या अधिक प्रॉपर्टी getter , setter या deleter फ़ंक्शन के लिए एक नया कार्यान्वयन प्रदान कर सकते हैं:

class BaseClass(object):
    @property
    def foo(self):
        return some_calculated_value()

    @foo.setter
    def foo(self, value):
        do_something_with_value(value)


class DerivedClass(BaseClass):
    @BaseClass.foo.setter
    def foo(self, value):
        do_something_different_with_value(value)

आप एक सेटर या डेलेटर भी जोड़ सकते हैं जहाँ पहले बेस क्लास पर कोई नहीं था।

डेकोरेटर्स के बिना गुणों का उपयोग करना

डेकोरेटर सिंटैक्स का उपयोग करते समय (@ के साथ) सुविधाजनक है, यह थोड़ा छुपा भी है। आप डेकोरेटर्स के बिना, सीधे गुणों का उपयोग कर सकते हैं। निम्नलिखित पायथन 3.x उदाहरण से पता चलता है:

class A:
    p = 1234
    def getX (self):
        return self._x

    def setX (self, value):
        self._x = value
            
    def getY (self):
        return self._y

    def setY (self, value):
        self._y = 1000 + value    # Weird but possible
        
    def getY2 (self):
        return self._y

    def setY2 (self, value):
        self._y = value
        
    def getT    (self):
        return self._t

    def setT (self, value):
        self._t = value
        
    def getU (self):
        return self._u + 10000

    def setU (self, value):
        self._u = value - 5000
            
    x, y, y2 = property (getX, setX), property (getY, setY), property (getY2, setY2)
    t = property (getT, setT)
    u = property (getU, setU)
    
A.q = 5678

class B:
    def getZ (self):
        return self.z_
    
    def setZ (self, value):
        self.z_ = value
        
    z = property (getZ, setZ)
    
class C:
    def __init__ (self):
        self.offset = 1234

    def getW (self):
        return self.w_ + self.offset
        
    def setW (self, value):
        self.w_ = value - self.offset
        
    w = property (getW, setW)
    
a1 = A ()
a2 = A ()

a1.y2 = 1000
a2.y2 = 2000

a1.x = 5
a1.y = 6

a2.x = 7
a2.y = 8

a1.t = 77
a1.u = 88
    
print (a1.x, a1.y, a1.y2)
print (a2.x, a2.y, a2.y2)
print (a1.p, a2.p, a1.q, a2.q)

print (a1.t, a1.u)

b = B ()
c = C ()

b.z = 100100
c.z = 200200
c.w = 300300

print (a1.x, b.z, c.z, c.w)

c.w = 400400
c.z = 500500
b.z = 600600

print (a1.x, b.z, c.z, c.w)


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow