पायथन में स्पष्ट 'स्व' से कैसे बचें?


131

मैं कुछ pygame ट्यूटोरियल का पालन ​​करके पायथन सीख रहा हूं ।

उसमें मुझे कीवर्ड स्व का व्यापक उपयोग मिला , और मुख्य रूप से जावा बैकग्राउंड से आने के बाद, मुझे पता चला कि मैं स्वयं टाइप करना भूल रहा हूं । उदाहरण के लिए, इसके बजाय, self.rect.centerxमैं टाइप करूंगा rect.centerx, क्योंकि, मेरे लिए, आयत पहले से ही कक्षा का एक सदस्य चर है।

जावा समानांतर मैं के लिए इस स्थिति से सदस्य चर के सभी संदर्भ उपसर्ग के लिए चल रहा है के बारे में सोच सकते हैं इस

क्या मैं सभी सदस्य चर को स्वयं के साथ उपसर्ग कर रहा हूं , या क्या उन्हें घोषित करने का कोई तरीका है जो मुझे ऐसा करने से बचने की अनुमति देगा?

यहां तक ​​कि अगर मैं जो सुझाव दे रहा हूं वह अजगर नहीं है , तो मैं अभी भी जानना चाहूंगा कि क्या यह संभव है।

मैंने इन संबंधित SO प्रश्नों पर एक नज़र डाली है, लेकिन वे इस बात का जवाब नहीं देते हैं कि मैं क्या हूँ:


5
मैं एक जावा बैकग्राउंड से आता हूं और इसे प्राकृतिक मानता हूं, लेकिन मैं स्पष्ट रूप से हर कॉल में "यह" जोड़ देता हूं ताकि यह स्पष्ट हो सके कि मैं एक उदाहरण चर का जिक्र कर रहा हूं।
उरई

4
क्या आप m_कुछ C ++ / Java प्रोग्रामर द्वारा देखे गए सभी सदस्य नामों के लिए एक उपसर्ग के सम्मेलन से परिचित हैं ? के उपयोग के self.एक समान तरीके से पठनीयता मदद करता है। इसके अलावा, आपको dirtsimple.org/2004/12/python-is-not-java.html पढ़ना चाहिए ।
बेनी चेर्नियाव्स्की-पास्किन

2
हालांकि आमतौर पर m_गैर-सार्वजनिक गैर-स्थैतिक डेटा सदस्यों के लिए ही उपयोग किया जाता है (कम से कम C ++ में)।

@ बेनी महान लिंक्ड लेख, और हां वास्तव में, मैं वास्तव mVariableNameमें जावा में कोडिंग करते समय, सदस्य चर के लिए उपयोग करने के सम्मेलन का पालन करता हूं । मुझे लगता है कि @ अनुराग की टिप्पणी ने इसे अच्छी तरह से गाया है, अजगर सीखने के दौरान एक जावा देव को क्या करना चाहिए।
बगुइज

11
तो, कैसे हर कोई ओपी को बता रहा है कि स्वयं का उपयोग करना अच्छा / आवश्यक / आदि क्यों है। लेकिन कोई यह नहीं कहता कि इससे बचा जा सकता है या नहीं? भले ही किसी तरह की गंदी चाल से?
einpoklum

जवाबों:


99

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

एक चरम उदाहरण: आप किसी भी वर्ग के किसी भी ज्ञान के बिना यह लिख सकते हैं कि उसके पास कौन से आधार वर्ग हो सकते हैं, और हमेशा यह जानते हैं कि आप सदस्य तक पहुँच रहे हैं या नहीं:

class A(some_function()):
  def f(self):
    self.member = 42
    self.method()

वह पूरा कोड है! (some_function आधार के रूप में इस्तेमाल किया गया प्रकार लौटाता है।)

एक और, जहां एक वर्ग के तरीके गतिशील रूप से निर्मित होते हैं:

class B(object):
  pass

print B()
# <__main__.B object at 0xb7e4082c>

def B_init(self):
  self.answer = 42
def B_str(self):
  return "<The answer is %s.>" % self.answer
# notice these functions require no knowledge of the actual class
# how hard are they to read and realize that "members" are used?

B.__init__ = B_init
B.__str__ = B_str

print B()
# <The answer is 42.>

याद रखें, ये दोनों उदाहरण चरम पर हैं और आप उन्हें हर दिन नहीं देखेंगे, और न ही मैं आपको सुझाव दे रहा हूं कि आपको अक्सर इस तरह का कोड लिखना चाहिए, लेकिन वे स्पष्ट रूप से स्वयं के पहलुओं को स्पष्ट रूप से दिखाना चाहते हैं।


4
धन्यवाद। यह जवाब स्पॉट कॉस को हिट करता है यह उपयोग करने के लाभों को भी बताता है self
बुगिज़

2
@Roger Pate: कृपया अजगर से इसे हटाने के लिए मेरे सवाल का संपादन बंद कर दें। मुझे लगता है कि यह वहां है। (और उत्तर के लिए धन्यवाद!)
bguiz

3
@bguiz: यह शीर्षक में टैग की नकल नहीं करने के लिए SO सम्मेलन है। हालांकि, जब मैंने 2 दिन पहले संपादित किया था, तो मैंने आपको 7 महीने पहले शीर्षक वापस नहीं देखा था।

1
यह अच्छा होगा यदि स्व को एकल चरित्र में कम किया जा सकता है।
dwjohnston

5
यह वास्तव में एक मूर्खतापूर्ण लग रहा है कारण है। अजगर छायावाद को स्वीकार करने में विफल हो सकता है, और आपको इसे विशेष रूप से घोषित करने की आवश्यकता होती है, अर्थात कुछ प्रकार के साथ अपने छायांकन क्षेत्र को 'आशीर्वाद' दें __shadow__ myFieldName। यह आकस्मिक छाया को रोकने के रूप में अच्छी तरह से, यह नहीं होगा?
einpoklum

39

पिछले उत्तर सभी मूल रूप से "आप नहीं कर सकते" या "आपको नहीं करना चाहिए" हैं। जबकि मैं बाद की भावना से सहमत हूं, प्रश्न तकनीकी रूप से अभी भी अनुत्तरित है।

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

import numpy as np
class MyFunkyGaussian() :
    def __init__(self, A, x0, w, s, y0) :
        self.A = float(A)
        self.x0 = x0
        self.w = w
        self.y0 = y0
        self.s = s

    # The correct way, but subjectively less readable to some (like me) 
    def calc1(self, x) :
        return (self.A/(self.w*np.sqrt(np.pi))/(1+self.s*self.w**2/2)
                * np.exp( -(x-self.x0)**2/self.w**2)
                * (1+self.s*(x-self.x0)**2) + self.y0 )

    # The correct way if you really don't want to use 'self' in the calculations
    def calc2(self, x) :
        # Explicity copy variables
        A, x0, w, y0, s = self.A, self.x0, self.w, self.y0, self.s
        sqrt, exp, pi = np.sqrt, np.exp, np.pi
        return ( A/( w*sqrt(pi) )/(1+s*w**2/2)
                * exp( -(x-x0)**2/w**2 )
                * (1+s*(x-x0)**2) + y0 )

    # Probably a bad idea...
    def calc3(self, x) :
        # Automatically copy every class vairable
        for k in self.__dict__ : exec(k+'= self.'+k)
        sqrt, exp, pi = np.sqrt, np.exp, np.pi
        return ( A/( w*sqrt(pi) )/(1+s*w**2/2)
                * exp( -(x-x0)**2/w**2 )
                * (1+s*(x-x0)**2) + y0 )

g = MyFunkyGaussian(2.0, 1.5, 3.0, 5.0, 0.0)
print(g.calc1(0.5))
print(g.calc2(0.5))
print(g.calc3(0.5))

तीसरा उदाहरण - अर्थात उपयोग for k in self.__dict__ : exec(k+'= self.'+k)करना मूल रूप से वह प्रश्न है जो वास्तव में पूछ रहा है, लेकिन मुझे स्पष्ट करना चाहिए कि मुझे नहीं लगता कि यह आम तौर पर एक अच्छा विचार है।

अधिक जानकारी के लिए, और कक्षा चर, या यहां तक ​​कि कार्यों के माध्यम से पुनरावृति करने के तरीके, इस प्रश्न के उत्तर और चर्चा देखें । डायनामिक रूप से नाम चर के अन्य तरीकों की चर्चा के लिए, और यह आमतौर पर एक अच्छा विचार क्यों नहीं है इस ब्लॉग पोस्ट को देखें

अद्यतन: पायथन 3 में एक फ़ंक्शन में स्थानीय रूप से गतिशील रूप से अपडेट या परिवर्तन करने का कोई तरीका नहीं प्रतीत होता है , इसलिए कैल्क 3 और समान संस्करण अब संभव नहीं हैं। एकमात्र python3 संगत समाधान जिसका मैं अब उपयोग कर सकता हूं globals:

def calc4(self, x) :
        # Automatically copy every class variable in globals
        globals().update(self.__dict__)
        sqrt, exp, pi = np.sqrt, np.exp, np.pi
        return ( A/( w*sqrt(pi) )/(1+s*w**2/2)
                * exp( -(x-x0)**2/w**2 )
                * (1+s*(x-x0)**2) + y0 )

जो, फिर से, सामान्य रूप से एक भयानक अभ्यास होगा।


4
प्रतिभाशाली! यह सबसे (केवल?) सही उत्तर है। +1 आप इसे करने का व्यावहारिक कारण भी बताते हैं। + 1 आई
डेविड लॉट

एक वर्ग बनाने और उसके अंदर कोड को स्थानांतरित करने के बाद: अब सभी विधियाँ और चर अब पहचाने नहीं जाते हैं ( स्वयं नहीं ..) मुझे अभी तक एक और कारण अजगर की याद दिलाया जाता है और मुझे साथ नहीं मिलता है। एक विचार के रूप में इसके लिए धन्यवाद। यह समग्र रूप से समस्या / सिरदर्द / अपठनीयता को ठीक नहीं करता है लेकिन एक मामूली समाधान प्रदान करता है।
जावदबा

केवल localsउपयोग करने के बजाय अपडेट क्यों नहीं किया जाता exec?
नाथन

मैंने locals().update(self.__dict__)अजगर 2 और 3 में कोशिश की , लेकिन यह काम नहीं किया। Python3 में भी 'निष्पादन' चाल अब कोई विकल्प नहीं है। दूसरी ओर, globals().update(self.__dict__)काम करता है, लेकिन सामान्य रूप से एक भयानक अभ्यास होगा।
argentum2f

26

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


1
यह उत्तर, विशेष रूप से दूसरा वाक्य, मेरे लिए स्वीकृत उत्तर की तुलना में कहीं अधिक उपयोगी है क्योंकि मुझे पता चल सकता है कि 'स्पष्ट स्व' पायथन में सीमाओं में से एक है और इससे बचने योग्य नहीं है
प्रश्न संख्या

21

आप उदाहरण के लिए, जो भी नाम चाहें, उसका उपयोग कर सकते हैं

class test(object):
    def function(this, variable):
        this.variable = variable

या और भी

class test(object):
    def function(s, variable):
        s.variable = variable

लेकिन आप गुंजाइश के लिए एक नाम का उपयोग करने के साथ फंस गए हैं।

मैं आपको स्वयं के लिए कुछ अलग उपयोग करने की सलाह नहीं देता हूं जब तक कि आपके पास एक ठोस कारण नहीं है, क्योंकि यह अनुभवी pythonistas के लिए विदेशी बना देगा।


26
आप ऐसा कर सकते हैं, लेकिन नहीं ! आपके कोड को वियर करने का कोई कारण नहीं है, क्योंकि यह आवश्यक है। हां, आप इसे कुछ भी कह सकते हैं, लेकिन सम्मेलन को इसे कॉल करना है self, और आपको सम्मेलन का पालन करना चाहिए। इसे देखने वाले किसी भी अनुभवी पायथन प्रोग्रामर के लिए आपके कोड को समझना आसान हो जाएगा। (इसमें आप शामिल हैं, अब से छह महीने बाद, यह जानने की कोशिश करें कि आपका पुराना कार्यक्रम क्या करता है!)
स्टीव डे

3
और भी अधिक एलियन:def function(_, variable): _.variable = variable
बॉब स्टीन

1
@ BobStein-VisiBone और भी अधिक एलियन:def funcion(*args): args[0].variable = args[1]
ऐमिल

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

> "वीडर"। अजगर है अजीब - विशेष रूप से अपनी कक्षाओं संरचनाओं और के इस प्रयोग स्वयं विरोधी पठनीयता के समर्थन के लिए एक कनारी है। मुझे पता है कि इसके बाद कई डिफेंडर्स आएंगे लेकिन इससे सत्यता नहीं बदलेगी।
जावदबा

9

हाँ, आपको हमेशा निर्दिष्ट करना चाहिए self, क्योंकि स्पष्ट रूप से अनुमान से बेहतर है, अजगर दर्शन के अनुसार।

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

वैसे। मैं पहले इसे नफरत करता था, अब मैं इसके विपरीत नफरत करता हूं। इंडेंट-चालित प्रवाह नियंत्रण के लिए भी ऐसा ही है।


2
"आप मॉड्यूल-स्तरीय फ़ंक्शन का बड़ा उपयोग करते हैं, जिसे बेहतर परीक्षण किया जा सकता है" संदिग्ध है, और मुझे दृढ़ता से असहमत होना होगा। यह सच है कि आप किसी भी चीज को किसी भी वर्ग की विधि (स्थिर या नहीं) बनाने के लिए मजबूर नहीं हैं, भले ही यह "तार्किक रूप से मॉड्यूल-स्तर" हो, लेकिन इसका स्वयं से कोई लेना-देना नहीं है और इसका कोई महत्वपूर्ण प्रभाव नहीं है एक तरह से परीक्षण या दूसरे (मेरे लिए)।

यह मेरे अनुभव से उत्पन्न होता है। मैं हर बार एक मंत्र के रूप में इसका पालन नहीं करता हूं, लेकिन अगर आप किसी भी चीज को अलग-अलग, स्वतंत्र विधि के रूप में सदस्य चर पहुंच की आवश्यकता नहीं है, तो यह परीक्षण करना आसान बनाता है। हां, आप डेटा से तर्क को अलग करते हैं, जो हां ओओपी के खिलाफ है, लेकिन वे मॉड्यूल स्तर पर एक साथ हैं। मैं एक या दूसरे को "सर्वश्रेष्ठ" चिह्न नहीं देता, यह सिर्फ स्वाद की बात है। कभी-कभी मैं अपने आप को कक्षा के तरीकों को निर्दिष्ट करता हूं, जिनका कक्षा के साथ कुछ भी लेना-देना नहीं है, क्योंकि वे selfकिसी भी तरह से स्पर्श नहीं करते हैं । तो उन्हें कक्षा में रखने का क्या मतलब है?
स्टेफानो बोरीनी

मैं इसके दोनों हिस्सों से असहमत हूं (ऐसा लगता है कि मैं "गैर-विधियों का उपयोग करता हूं" अन्य भाषाओं की तुलना में अधिक बार नहीं), लेकिन "जो कि बेहतर परीक्षण किया जा सकता है" इसका मतलब यह है कि एक तरीका दूसरे से बेहतर है (यह है कि बस कैसे मैं इसे पढ़ें (संभावना नहीं लगती है), जबकि मुझे अपने अनुभव में इसके लिए समर्थन नहीं मिला है। ध्यान दें कि मैं यह नहीं कह रहा हूं कि आपको हमेशा एक या दूसरे का उपयोग करना चाहिए, मैं केवल यह कह रहा हूं कि विधियां और गैर-विधियां समान रूप से परीक्षण करने में सक्षम हैं।

5
हां, बेशक आप कर सकते हैं, लेकिन दृष्टिकोण अलग है। ऑब्जेक्ट में एक राज्य है, एक मॉड्यूल स्तर विधि नहीं है। यदि आपको पता चलता है कि क्लास-स्तरीय पद्धति का परीक्षण करते समय एक परीक्षा विफल हो जाती है, तो दो चीजें गलत हो सकती थीं: 1) कॉल 2 के समय ऑब्जेक्ट स्थिति) विधि ही। यदि आपके पास एक स्टेटलेस मॉड्यूल-स्तरीय विधि है, तो केवल केस 2 हो सकता है। आपने ऑब्जेक्ट से सेटअप को स्थानांतरित कर दिया (जहां यह परीक्षण के रूप में ब्लैक बॉक्स है, क्योंकि यह परीक्षण के लिए वस्तु के अंदर अंततः जटिल तर्क द्वारा शासित है)। आप जटिलता को कम कर रहे हैं और सेटअप का सख्त नियंत्रण रख रहे हैं।
स्टेफानो बोरीनी

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

4

"स्व" एक वर्ग के वर्तमान वस्तु उदाहरण का पारंपरिक प्लेसहोल्डर है। इसका उपयोग तब किया जाता है जब आप किसी वर्ग के अंदर ऑब्जेक्ट की संपत्ति या फ़ील्ड या विधि को संदर्भित करना चाहते हैं जैसे कि आप "स्वयं" का उल्लेख कर रहे हैं। लेकिन इसे पायथन प्रोग्रामिंग क्षेत्र में किसी को छोटा करने के लिए "स्वयं" का उपयोग करना शुरू कर दिया, अन्य क्षेत्र "इस" का उपयोग करते हैं, लेकिन वे इसे एक कीवर्ड के रूप में बनाते हैं जिसे प्रतिस्थापित नहीं किया जा सकता है। मैंने कोड पठनीयता बढ़ाने के लिए "इसके" का उपयोग किया। पायथन में इसकी अच्छी चीजों में से एक - आपको "स्व" के अलावा ऑब्जेक्ट के उदाहरण के लिए अपना खुद का प्लेसहोल्डर चुनने की स्वतंत्रता है। स्वयं के लिए उदाहरण:

class UserAccount():    
    def __init__(self, user_type, username, password):
        self.user_type = user_type
        self.username = username            
        self.password = encrypt(password)        

    def get_password(self):
        return decrypt(self.password)

    def set_password(self, password):
        self.password = encrypt(password)

अब हम 'स्व' को 'उसके' से प्रतिस्थापित करते हैं:

class UserAccount():    
    def __init__(its, user_type, username, password):
        its.user_type = user_type
        its.username = username            
        its.password = encrypt(password)        

    def get_password(its):
        return decrypt(its.password)

    def set_password(its, password):
        its.password = encrypt(password)

जो अब अधिक पठनीय है?


क्यों नहीं s(या कुछ अन्य एकल पत्र) के बजायits
javadba

'इसके' का एक अर्थ है और 'एस' नहीं है।
लेमेल एडाने

sएक ही अर्थ है: कक्षा उदाहरण के लिए एक उपनाम। मुझे यह देखना होगा कि itsसंदर्भ में इसका क्या मतलब है
जवादबा

दोनों मेरे लिए पठनीय नहीं हैं। बाहरी पैरामीटर के रूप में "अपने आप" को प्राप्त करना अभी भी अतार्किक है, इसका कोई मतलब नहीं है।
सीजर

3

स्वयं वस्तुओं के सदस्यों तक पहुंचने के लिए अजगर सिंटैक्स का हिस्सा है, इसलिए मुझे डर है कि आप इसके साथ फंस गए हैं


2
सेल्फ एक्सेसिफ़ाइटर बताने का एक तरीका है, वास्तव में एक का उपयोग किए बिना। +1
पेराफुलकोडर

1

वास्तव में आप Armin Ronacher प्रस्तुति "5 साल के बुरे विचारों" (Google it) से नुस्खा "निहित आत्म" का उपयोग कर सकते हैं।

यह एक बहुत ही चतुर नुस्खा है, जैसा कि आर्मिन रोनचेर की लगभग हर चीज है, लेकिन मुझे नहीं लगता कि यह विचार बहुत आकर्षक है। मुझे लगता है कि मैं सी # / जावा में इसे स्पष्ट करना पसंद करूंगा ।

अपडेट करें। "बुरा विचार नुस्खा" से लिंक करें: https://speakerdeck.com/mitsuhiko/5-years-of-bad-ideas?slide=58


क्या यह वह कड़ी है जिसका आप जिक्र कर रहे हैं जिसे आप संदर्भित कर रहे थे? यदि ऐसा है तो pls आपके उत्तर में शामिल हैं
reubenjohn

नहीं, अर्मिन "बुरा विचार" मेरे स्वाद के लिए अधिक मज़ेदार लगता है। मैंने लिंक शामिल किया।
एलेक्स यू

इससे पहले कि आप नुस्खा लिंक पर क्लिक करें, ध्यान दें कि यह इसे def method(<del> self </ del> )पैरामीटर सूची में निहित करता है , लेकिन फिर self.variableभी इस चतुर हैक के साथ आवश्यक है।
डेविड लॉट

0

हाँ, स्व थकाऊ है। लेकिन, क्या यह बेहतर है?

class Test:

    def __init__(_):
        _.test = 'test'

    def run(_):
        print _.test

10
_पायथन शेल में विशेष अर्थ है, जहां यह अंतिम लौटा मूल्य रखता है। इसे इस तरह उपयोग करना सुरक्षित है, लेकिन संभावित रूप से भ्रमित करना; मैं इससे बचूंगा।
केयर्नवोन

नहीं, यह बेहतर नहीं है, लेकिन इसके बजाय एक भी पत्र क्यों नहीं है उदाहरण के लिए ( sया mC ++ की नकल करने के लिए)
javadba

0

प्रेषक: सेल्फ हेल - अधिक राज्यगत कार्य।

... एक संकर दृष्टिकोण सबसे अच्छा काम करता है। आपके सभी क्लास के तरीके जो वास्तव में कम्प्यूटेशन करते हैं, उन्हें क्लोजर में स्थानांतरित किया जाना चाहिए, और सिंटैक्स को साफ करने के लिए एक्सटेंशन को कक्षाओं में रखा जाना चाहिए। क्लासेस में क्लोज़र को स्टफ करें, क्लास को एक नेमस्पेस की तरह ट्रीट करें। क्लोज़र अनिवार्य रूप से स्थिर कार्य हैं, और इसलिए सेल्फ की आवश्यकता नहीं है *, यहां तक ​​कि कक्षा में भी ...


क्लोजर छोटे उपयोग के मामलों के लिए ठीक हैं, लेकिन उनके विस्तारित उपयोग से प्रोग्राम की मेमोरी ओवरहेड काफी बढ़ जाएगी (जैसा कि आप क्लास-आधारित ओओ के बजाय प्रोटोटाइप-आधारित ओओ का उपयोग कर रहे हैं - इसलिए प्रत्येक ऑब्जेक्ट को अपने स्वयं के कार्यों के सेट की आवश्यकता होती है बल्कि एक वर्ग में कार्यों का एक सामान्य सेट)। इसके अलावा, यह आपको जादू / डंडर विधियों (जैसे __str__और जैसे) के लिए सक्षम होने से रोक देगा क्योंकि ये सामान्य तरीकों से अलग तरीके से लागू होते हैं।
टिब्बा

0

मुझे लगता है कि यह आसान और अधिक पठनीय होगा यदि एक बयान "सदस्य" था जैसा कि "वैश्विक" है, इसलिए आप दुभाषिया को बता सकते हैं जो कक्षा के ऑब्जेक्ट सदस्य हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.