2010-03-09 9 views
32

पायथन में कक्षा गुणों को परिभाषित करने का पसंदीदा तरीका कौन सा है और क्यों? क्या यह एक वर्ग में दोनों का उपयोग करना ठीक है?पायथन में संपत्तियों को परिभाषित करने का पसंदीदा तरीका: संपत्ति सजावट या लैम्ब्डा?

@property 
def total(self): 
    return self.field_1 + self.field_2 

या

total = property(lambda self: self.field_1 + self.field_2) 
+1

आपने यह "लैम्बडा के माध्यम से संपत्ति" कहां देखी है, जिससे आपको लगता है कि यह "पसंदीदा" हो सकता है? क्या आपने इनमें से बहुत कुछ देखा? यदि हां, तो कहाँ? –

+0

@ एसएलट कुछ पायथन किताब, मुझे याद नहीं है। मैं अब से सजावटी का उपयोग करूंगा। कोई बात नहीं। :-) – parxier

उत्तर

21

डेकोरेटर प्रपत्र शायद मामले में सबसे अच्छा आप दिखाया है, जहाँ आप केवल पढ़ने के लिए संपत्ति में विधि चालू करना चाहते है। दूसरा मामला बेहतर होता है जब आप एक सेटर/डिलीटर/डॉकस्ट्रिंग के साथ-साथ गेटटर प्रदान करना चाहते हैं या यदि आप उस प्रॉपर्टी को जोड़ना चाहते हैं जिसमें विधि के लिए एक अलग नाम है, तो इसका मूल्य प्राप्त होता है।

+10

+1: कृपया lambdas का उपयोग न करें। कृप्या। –

+28

एसएलॉट - क्यों नहीं? (बहस नहीं - बस उत्सुक) – Yarin

+0

@ एसएलओटी: ठीक है, लेकिन लैम्बडास की सीमा के लिए आपका कामकाज क्या है, हालांकि डॉक्टरों को डॉकस्ट्रिंग की इजाजत नहीं है? – smci

4

इसके लिए लैम्बडा का उपयोग न करें। पहला केवल पढ़ने योग्य संपत्ति के लिए स्वीकार्य है, दूसरा जटिल मामलों के लिए वास्तविक तरीकों के साथ प्रयोग किया जाता है।

49
केवल पढ़ने के लिए गुण मैं डेकोरेटर का उपयोग करें

, और मैं आमतौर पर कुछ इस तरह करते हैं:

class Bla(object): 
    def sneaky(): 
     def fget(self): 
      return self._sneaky 
     def fset(self, value): 
      self._sneaky = value 
     return locals() 
    sneaky = property(**sneaky()) 

अद्यतन:

class Bla(object): 
    @property 
    def elegant(self): 
     return self._elegant 

    @elegant.setter 
    def elegant(self, value): 
     self._elegant = value 
: अजगर का

हाल संस्करणों डेकोरेटर दृष्टिकोण बढ़ाया

+2

मुझे इस नोटेशन का उपयोग करते समय flake8, pyflakes का उपयोग करते समय त्रुटियां मिल रही हैं। मुझे फ़ंक्शन 'सुरुचिपूर्ण' चेतावनियों का पुनर्वितरण मिलता है। – Stephan

+0

पिलिंट के साथ, सजावट का उपयोग करने के लिए एक अतिरिक्त लाभ है। संरक्षित सदस्य तक पहुंचने वाले गुणों के साथ [पिलिंट चेतावनी 'W0212' देखें: कैसे बचें?] (Http://stackoverflow.com/questions/24833362/pylint-warning-w0212-with-properties-accessing-a- संरक्षित- मासिक- कैसे करने के लिए avoi)। यह वापस मूल्य/वस्तु की जांच करने के लिए पिलिंट की क्षमता को बरकरार रखता है। – Hibou57

संबंधित मुद्दे