Python Language
संपत्ति वस्तुओं
खोज…
टिप्पणियों
नोट : पायथन 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)