2011-02-04 26 views
5

मैं निम्नलिखित कोड है:जब मैं सार्वजनिक विधि के अंदर हूं तो मैं निजी विधि क्यों नहीं कह सकता?

class MyClass: 
    def __private(self): 
     print "Hey man! This is private!" 

    def public(self): 
     __private() 
     print "I don't care if you see this!" 

if __name__ == '__main__': 
    x = MyClass() 
    x.public() 

हालांकि यह मुझे निम्न त्रुटि देता है:

NameError: global name '_MyClass__private' is not defined

क्या मैं गलत कर रहा हूँ?

+3

, यदि आप नहीं पहले से ही है, प्रलेखन के इस खंड को पढ़ने: http://docs.python.org/tutorial/classes.html#private-variables एकल अंडरस्कोर "निजी" चर के लिए सामान्य सम्मेलन हैं। जब आप अपने 'MyClass' से प्राप्त कक्षाओं में नाम संघर्ष से बचना चाहते हैं तो आप आमतौर पर केवल डबल अंडरस्कोर का उपयोग करते हैं। डबल अंडरस्कोर नाम मैंगलिंग का आह्वान करेगा, जो आप यहां चाहते थे, लेकिन मैं यह सुनिश्चित करना चाहता था कि आप इसके बारे में जानते हैं ... –

+1

कृपया '__' का उपयोग न करें। यह "नाम मैंगलिंग" के लिए आरक्षित है, एक चीज पाइथन आंतरिक रूप से यह सुनिश्चित करने के लिए करती है कि आंतरिक नाम कभी भी टकराए न हों। –

उत्तर

20

आप self की जरूरत है: की तरह ऐसा लगता है कि आप कर रहे हैं

अजगर में
self.__private() 

क्लासेस, आप सी #/सी ++/जावा से आ रहे हैं, तो करने के लिए इस्तेमाल हो रही है ले लो। यह शायद शब्दों की चीजों के "पायथनिक" तरीके को कुचलने वाला है, लेकिन आप इसके बारे में सोच सकते हैं (इससे मुझे मदद मिली):

प्रत्येक श्रेणी self के रूप में परिभाषित नामस्थान को परिभाषित करती है और बिना किसी नाम से उस वर्ग का एक उदाहरण। दो अंडरस्कोर के साथ "निजी" चीजें उलझन में आती हैं ताकि बिना आपको इसे किसी विशेष नाम से कॉल कर सकें, लेकिन भीतर से आप आसानी से का उपयोग कर सकते हैं।

जो उसकी टिप्पणी सामान्य निजी चर में उल्लेख किया है आम तौर पर सिर्फ एक अंडरस्कोर के साथ नाम हैं, डबल अंडरस्कोर यह इतना विरासत उप-वर्गों में नाम संघर्ष के बिना काम कर सकते हैं mangles। पायथन में गोपनीयता का कोई प्रवर्तन नहीं है, यह पूरी तरह से सम्मेलन है जो कहता है कि आप वर्ग के बाहर से एक निजी चर का उपयोग नहीं कर सकते हैं।

जैसा कि थॉमस ने उल्लेख किया है, self भी एक सम्मेलन है। किसी भी विधि के लिए उदाहरण है कि विधि पर में पारित पहले पैरामीटर है बुलाया जा रहा है (एक समारोह एक वर्ग का हिस्सा के रूप में घोषित) तुम बस के रूप में आसानी से कर सकता है:।

def __private(randomText): 
    print "Hey man! This is private!" 

def public(otherRandomText): 
    otherRandomText.__private() 
    print "I don't care if you see this!" 

हालांकि, अगर आप ऐसा कर तर्क और अच्छी प्रोग्रामिंग शैली की आत्माएं आपको और आपके वंशजों को अनंत काल तक डराएंगी। (self बहुत बेहतर है)।

कोई भी Pythonistas सही/आगे व्याख्या करने की इच्छा है?

+0

और अब मैं कुल बेवकूफ की तरह महसूस करता हूं। धन्यवाद! –

+2

इसके बारे में चिंता मत करो आदमी! मैं आपको नहीं बता सकता कि मैंने कितनी बार ऐसा किया है। जब भी आप भाषाओं के बीच स्विच करते हैं तो यह संभवतः तब भी हो रहा है। – Crisfole

+2

@Bob @Cpfohl Yup, मुझे हर बार PHP में भी पकड़ता है, सिर्फ इसलिए कि मैंने सी ++ करने में इतने सालों बिताए हैं ... –

3

आपका कोड है के रूप में एक स्थिर समारोह MyCalls .__ निजी कॉल करने के लिए, आप ऐसा करना चाहते हैं कोशिश कर रहा है: इसके अलावा

class MyClass: 
    def __private(self): 
     print "Hey man! This is private!" 

    def public(self): 
     self.__private() 
     print "I don't care if you see this!" 

if __name__ == '__main__': 
    x = MyClass() 
    x.public()