python - for - पाइथन "संपत्ति" और "विशेषता" के बीच क्या अंतर है?



python language in hindi (4)

एक संपत्ति के साथ आपके पास अपने गेटटर, सेटर और डिलीटर विधियों पर पूर्ण नियंत्रण होता है, जो आपके पास एक विशेषता के साथ नहीं है (अगर चेतावनी का उपयोग नहीं करते हैं)।

class A(object):
    _x = 0
    '''A._x is an attribute'''

    @property
    def x(self):
        '''
        A.x is a property
        This is the getter method
        '''
        return self._x

    @x.setter
    def x(self, value):
        """
        This is the setter method
        where I can check it's not assigned a value < 0
        """
        if value < 0:
            raise ValueError("Must be >= 0")
        self._x = value

>>> a = A()
>>> a._x = -1
>>> a.x = -1
Traceback (most recent call last):
  File "ex.py", line 15, in <module>
    a.x = -1
  File "ex.py", line 9, in x
    raise ValueError("Must be >= 0")
ValueError: Must be >= 0

https://ffff65535.com

मैं आम तौर पर "संपत्ति" और "विशेषता" के बीच के अंतर के बारे में उलझन में हूं, और मतभेदों को संक्षेप में विस्तारित करने के लिए एक महान संसाधन नहीं ढूंढ सकता।


एक स्पष्ट अंतर भी नहीं है जिसका उपयोग मैं डेटा को कैश या रीफ्रेश करने के लिए करता हूं, अक्सर हमारे पास क्लास एट्रिब्यूट से जुड़ा एक फ़ंक्शन होता है। उदाहरण के लिए मुझे एक बार फ़ाइल को पढ़ने और विशेषता को असाइन की गई सामग्री रखने की आवश्यकता है ताकि मूल्य कैश किया जा सके:

class Misc():
        def __init__(self):
            self.test = self.test_func()

        def test_func(self):
            print 'func running'
            return 'func value'

cl = Misc()
print cl.test
print cl.test

आउटपुट:

func running
func value
func value

हमने दो बार विशेषता का उपयोग किया लेकिन हमारे समारोह को केवल एक बार निकाल दिया गया। संपत्ति का उपयोग करने के लिए उपर्युक्त उदाहरण को बदलने से प्रत्येक बार जब आप इसे एक्सेस करते हैं तो विशेषता का मूल्य ताज़ा हो जाएगा:

class Misc():

    @property
    def test(self):
        print 'func running'
        return 'func value'

cl = Misc()
print cl.test
print cl.test

आउटपुट:

func running
func value
func running
func value

मैंने संक्षेप में बर्ड क्लेन की site से 2 मतभेद सीखा:

1. संपत्ति डेटा encapsulation करने के लिए एक और सुविधाजनक तरीका है।

उदाहरण: यदि आपके पास ऑब्जेक्ट की सार्वजनिक विशेषता है, तो बाद में, आपके प्रोजेक्ट के लिए आपको इसे समाहित करने की आवश्यकता है, यानी: इसे निजी में बदलें और गेटर और सेटर => प्रदान करें, आपको पहले से लिखे गए कई कोड बदलना होगा:

#Old codes
obj1.length=obj1.length+obj2.length
#New codes(Using private attibutes and getter and setter)
obj1.set_lenght(obj1.get_length()+obj2.get_length()) #=> this is ugly

यदि आप @property और @ lenght.setter => का उपयोग करते हैं तो आपको उन पुराने कोडों को बदलने की आवश्यकता नहीं है

2. एक संपत्ति कई विशेषताओं को समाहित कर सकती है

class Person:
  def __init__(self, name, physic_health, mental_health):
    self.name=name
    self.__physic_health=physic_health #physic_health is real value in range [0, 5.0]
    self.__mental_health=mental_health #mental_health is real value in range [0, 5.0]
  @property
  def condition(self):
    health=self.__physic_health+self.__mental_health
    if(health<5.0):
      return "I feel bad!"
    elif health<8.0:
      return "I am ok!"
    else:
      return "Great!"

इस उदाहरण में, __physic_health और __mental_health निजी हैं और सीधे बाहर की ओर से नहीं पहुंचा जा सकता है, कक्षा के बाहर बातचीत करने का एकमात्र तरीका संपत्ति की condition


संपत्ति आपको सामान्य गुणों जैसे मूल्यों को प्राप्त करने और सेट करने की अनुमति देती है, लेकिन नीचे एक विधि है जिसे इसे आपके लिए गेटटर और सेटर में अनुवाद करने के लिए कहा जाता है। यह वास्तव में सिर्फ गेटर्स और सेटर्स को कॉल करने के बॉयलरप्लेट पर कटौती करने की सुविधा है।

आइए उदाहरण के लिए कहें, आपके पास एक कक्षा थी जिसमें आपको कुछ आवश्यक चीज़ों के लिए कुछ एक्स और वाई निर्देशांक आयोजित किए गए थे। उन्हें सेट करने के लिए आप कुछ ऐसा करना चाहेंगे:

myObj.x = 5
myObj.y = 10

लिखने के बारे में सोचना और सोचना बहुत आसान है:

myObj.setX(5)
myObj.setY(10)

समस्या यह है कि, क्या होगा यदि एक दिन आपकी कक्षा इस तरह बदलती है कि आपको कुछ मूल्य से अपने एक्स और वाई को ऑफसेट करना होगा? अब आपको अपनी कक्षा परिभाषा और उस कोड के सभी कोड को बदलने और बदलने की आवश्यकता होगी, जो वास्तव में समय लेने वाली और त्रुटि प्रवण हो सकती है। संपत्ति आपको बाद के परिवर्तन की लचीलापन देते हुए पूर्व वाक्यविन्यास का उपयोग करने की अनुमति देती है।

पायथन में, आप प्रॉपर्टी फ़ंक्शन के साथ गेटर्स, सेटर्स और विधियों को डिलीट कर सकते हैं। यदि आप केवल पढ़ने की संपत्ति चाहते हैं, तो एक @property सजावट भी है जिसे आप अपनी विधि से ऊपर जोड़ सकते हैं।

http://docs.python.org/library/functions.html#property





python