एक वर्ग विधि से `वापसी स्व` का उद्देश्य?


46

मैं एक ओपन-सोर्स प्रोजेक्ट में कुछ इस तरह से आया था। इंस्टेंस विशेषताओं को संशोधित करने वाले तरीके उदाहरण के लिए एक संदर्भ लौटाते हैं। इस निर्माण का उद्देश्य क्या है?

class Foo(object):

  def __init__(self):
    self.myattr = 0

  def bar(self):
    self.myattr += 1
    return self

2
और यह सभी jQuery के बहुत ज्यादा लिखा है। लगभग हर फंक्शन एक jQuery ऑब्जेक्ट देता है
CaffGeek

11
आप उस तरह लिखे गए कोड पर भरोसा क्यों नहीं करेंगे?
sepp2k

जवाबों:


65

इसे चैनिंग की अनुमति है।

उदाहरण के लिए:

var Car = function () {
    return {
        gas : 0,
        miles : 0,
        drive : function (d) {
            this.miles += d;
            this.gas -= d;
            return this;
        },
        fill : function (g) {
            this.gas += g;
            return this;
        },
    };
}

अब आप कह सकते हैं:

var c = Car();
c.fill(100).drive(50);
c.miles => 50;
c.gas => 50;

20
रिकॉर्ड के लिए, इस तरह की चेनिंग को आमतौर पर धाराप्रवाह इंटरफ़ेस के साथ कोड पर देखा जाता है
रेयान

10

जैसा कि @Lie Ryan और @Frank Shearar ने उल्लेख किया है कि इसे "धाराप्रवाह इंटरफ़ेस" कहा जाता है, लेकिन यह पैटर्न वास्तव में लंबे समय से है।

उस पैटर्न का विवादास्पद हिस्सा यह है कि OO में, आपके पास परिवर्तनशील स्थिति है, इसलिए एक शून्य विधि का एक प्रकार का निहित रिटर्न मान है this- अर्थात, अद्यतन स्थिति के साथ ऑब्जेक्ट वापसी मूल्य का एक प्रकार है।

तो एक ओओ भाषा में परिवर्तनशील स्थिति के साथ, ये दोनों कमोबेश बराबर हैं:

a.doA()
a.doB()
a.doC()

...विरोध के रूप में

a.doA().doB().doC()

इसलिए मैंने अतीत में लोगों को धाराप्रवाह इंटरफेस का विरोध करते हुए सुना है क्योंकि वे पहले रूप को पसंद करते हैं। "धाराप्रवाह इंटरफ़ेस" के लिए मैंने सुना है एक और नाम "ट्रेन मलबे";)

मैं कहता हूं "अधिक या कम समकक्ष", हालांकि, क्योंकि धाराप्रवाह इंटरफेस एक शिकन जोड़ते हैं। उन्हें "इसे वापस करने" की ज़रूरत नहीं है। वे "नया लौटा सकते हैं"। यह OO में अपरिवर्तनीय वस्तुओं को प्राप्त करने का एक तरीका है।

तो आपके पास एक वर्ग A हो सकता है जो (pseudocode) करता है

function doA():
    return new A(value + 1)

function doB():
    return new A(value * 2)

function doC():
    return new A(sqrt(value))

अब, प्रत्येक विधि एक नई वस्तु लौटाती है, जिससे प्रारंभिक वस्तु अपरिवर्तित रहती है। और यह वास्तव में आपके कोड में बहुत बदलाव के बिना अपरिवर्तनीय वस्तुओं में शामिल होने का एक तरीका है।


ठीक है, लेकिन अगर आपके तरीके वापस आते हैं new(...), तो यह स्मृति को लीक करेगा।
23

@smci यह भाषा, कार्यान्वयन और उपयोग पर बहुत अधिक निर्भर करेगा। यकीन है, अगर यह C ++ है, तो आप संभवतः सभी जगह मेमोरी लीक कर देंगे। लेकिन यह सब एक कचरा कलेक्टर के साथ एक भाषा द्वारा तुच्छ रूप से साफ किया जाएगा। कुछ क्रियान्वयन (जीसी के साथ या बिना) भी पता लगा सकते हैं जब उन नई वस्तुओं में से एक का उपयोग नहीं किया जाता है और वास्तव में कुछ भी आवंटित नहीं किया जाता है।
8bittree

@ 8bittree: हम अजगर के बारे में बात कर रहे हैं, इस सवाल को 8 साल पहले पायथन को टैग किया गया था। पायथन जीसी पहली जगह में स्मृति को लीक नहीं करने के लिए बहुत अच्छा नहीं है। __init__बार-बार बुलाने से ओवरहेड का भी परिचय होता है।
21

8

अधिकांश भाषा 'रिटर्न सेल्फ ’मुहावरे के बारे में जानते हैं, और इसे एक पंक्ति में उपयोग नहीं किए जाने पर अनदेखा करते हैं। हालांकि यह उल्लेखनीय है कि पायथन में, फ़ंक्शन Noneडिफ़ॉल्ट रूप से लौटते हैं ।

जब मैं सीएस स्कूल में था तब मेरे प्रशिक्षक ने कार्यों, प्रक्रियाओं, दिनचर्या और तरीकों के बीच अंतर के बारे में एक बड़ा सौदा किया; कई हैंड-क्रैम्पिंग निबंध के प्रश्न यांत्रिक पेंसिल के साथ मेरे हाथों में गर्म हो रहे थे।

यह कहने के लिए पर्याप्त है, स्व वापस लौटना एक निश्चित ओओ तरीका है शिल्प वर्ग के तरीकों के लिए, लेकिन पायथन कई वापसी मूल्यों, ट्यूपल्स, सूचियों, वस्तुओं, आदिम या किसी के लिए भी अनुमति नहीं देता है।

चेनिंग, जैसा कि वे इसे कहते हैं, केवल अंतिम ऑपरेशन के उत्तर को अगले में डाल रहा है, और पायथन का रनटाइम उस तरह का अनुकूलन कर सकता है। सूची की समझ एक अंतर्निहित रूप है। (बहुत शक्तिशाली!)

तो पायथन में यह इतना महत्वपूर्ण नहीं है कि प्रत्येक विधि या फ़ंक्शन चीजों को लौटाता है, यही वजह है कि डिफ़ॉल्ट कोई भी नहीं है।

इस विचार की एक पाठशाला है कि किसी कार्यक्रम में प्रत्येक क्रिया को अपनी सफलता, विफलता या परिणाम को वापस लाने के संदर्भ या वस्तु पर रिपोर्ट करना चाहिए, लेकिन तब DOD ADA आवश्यकताएँ यहाँ बात नहीं कर रही थीं। यदि आपको किसी विधि से प्रतिक्रिया प्राप्त करने की आवश्यकता है, तो आगे बढ़ें, या नहीं, लेकिन इसके बारे में लगातार बने रहने का प्रयास करें।

यदि कोई विधि विफल हो सकती है, तो उसे सफलता या असफलता वापस करनी चाहिए या संभाला जाना चाहिए।

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

जब आप ऐसा करने की कोशिश करते हैं तो टाइप-प्रतिबंधात्मक भाषाएं चिल्लाती हैं और चिल्लाती हैं और टूट जाती हैं, लेकिन व्याख्या की गई (पायथन, लुआ, लिस्प) बहुत अधिक गतिशील हैं।


4

स्मालटाकल में, प्रत्येक विधि जो स्पष्ट रूप से कुछ वापस नहीं करती है, का एक निहितार्थ "रिटर्न सेल्फ" है।

ऐसा इसलिए है क्योंकि (ए) प्रत्येक विधि को वापस करने से कुछ कंप्यूटिंग मॉडल को अधिक समान बनाता है और (बी) यह बहुत उपयोगी है जो स्वयं को वापस करने के तरीके हैं। जोश के एक अच्छा उदाहरण देता है।


दिलचस्प ... में Python, हर विधि जो स्पष्ट रूप से कुछ वापस नहीं करती है, का एक निहितार्थ "वापसी कोई नहीं" है।
जॉब

2

किसी वस्तु को वापस करने का अधिकार ( return self)

  • उदाहरण:

    print(foo.modify1().modify2())
    
    # instaed of
    foo.modify1()
    foo.modify2()
    print(foo)
    
  • प्रोग्रामिंग समुदाय में अधिक लोकप्रिय शैली (मुझे लगता है)।

किसी वस्तु को परिवर्तित करने का अधिकार (नहीं return self)

  • returnअन्य उद्देश्यों के लिए उपयोग करने की क्षमता ।
  • गुइडो वैन रोसुम इस शैली का अनुमोदन करता है (मैं उनके तर्क से असहमत हूं)।
  • पायथन समुदाय में अधिक लोकप्रिय शैली (मुझे लगता है)।
  • डिफ़ॉल्ट (कम स्रोत कोड)।

गुइडो तर्क मुझे मजबूर कर रहा है। उस हिस्से का विशेष रूप जहां वह "के बारे में बात करता है पाठक को प्रत्येक तरीकों से परिचित होना चाहिए" यानी यह आपको यह निर्धारित करने की आवश्यकता है कि क्या यह एक आत्म श्रृंखला या आउटपुट श्रृंखला या एक कॉम्बो है इससे पहले कि आप समझते हैं कि आपके पास क्या है चैन
नाथ

@Nat कैसे स्ट्रिंग प्रसंस्करण संचालन मूलभूत रूप से शेष संचालन से भिन्न होता है?
21

अंतर यह है कि स्ट्रिंग केस आपके द्वारा हर बार एक नई पूरी तरह से अलग वस्तु उत्पन्न कर रहा है। यानी जगह में आइटम को संशोधित नहीं करना। यह स्पष्ट है कि मौजूदा वस्तु को संशोधित नहीं किया जा रहा है। ऐसी भाषा में जहां स्वंय वापस आना निहित है, यह सच है लेकिन मिश्रित वातावरण समस्याग्रस्त लगता है
नाथ

@ मट्ट मुझे बस इतना याद है कि पायथन तार अपरिवर्तनीय हैं। जो मेरे सवाल का पूरी तरह से जवाब देता है।
xged

1
@ मैट "यह स्पष्ट है कि मौजूदा वस्तु को संशोधित नहीं किया जा रहा है" - यह अभी देखने से स्पष्ट नहीं है।
x
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.