2012-02-04 15 views
14

मैं उसी वर्ग के किसी अन्य फ़ंक्शन से निजी फ़ंक्शन कैसे कॉल कर सकता हूं?उसी वर्ग के भीतर निजी फ़ंक्शन को कॉल करना python

class Foo: 
    def __bar(arg): 
    #do something 
    def baz(self, arg): 
    #want to call __bar 

अभी, जब मैं यह कर:

NameError: global name '_Foo__createCodeBehind' is not defined 

कोई मुझे बता सकते हैं कि त्रुटि के कारण है:

__bar(val) 

baz से(), मैं इस मिल सकता है? इसके अलावा, मैं किसी अन्य निजी फ़ंक्शन से निजी फ़ंक्शन कैसे कॉल कर सकता हूं?

उत्तर

18

आपके पास सी/सी ++ आदि में पाइथन में कोई अंतर्निहित this-> नहीं है। आपको इसे self पर कॉल करना होगा।

class Foo: 
    def __bar(self, arg): 
     #do something 
    def baz(self, arg): 
     self.__bar(arg) 

इन विधियों हालांकि वास्तव में निजी नहीं हैं। जब आप दो अंडरस्कोर के साथ एक विधि नाम शुरू करते हैं तो पाइथन कुछ नामों को "निजी" बनाने के लिए उलझन में डालता है और यह सब कुछ करता है, यह अन्य भाषाओं की तरह कुछ भी लागू नहीं करता है। यदि आप को Foo पर परिभाषित करते हैं, तो यह अभी भी Foo._Foo__bar के माध्यम से ऑब्जेक्ट के बाहर से एक्सेसिबल है। जैसे, एक ऐसा कर सकते हैं:

f = Foo() 
f._Foo__bar('a') 

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

आप दस्तावेज़ों में here पा सकते हैं।

5

__bar "निजी" (अर्थ है कि इसके नाम से पता mangled किया गया है में) है, लेकिन यह अभी भी Foo की एक विधि है, ताकि आप self के माध्यम से इसे संदर्भ और इसे करने के लिए self पारित करने के लिए की है। बस इसे एक नंगे __bar() के साथ कॉल करना काम नहीं करेगा; आपको इसे इस तरह कॉल करना होगा: self.__bar()। तो ...

>>> class Foo(object): 
... def __bar(self, arg): 
...  print '__bar called with arg ' + arg 
... def baz(self, arg): 
...  self.__bar(arg) 
... 
>>> f = Foo() 
>>> f.baz('a') 
__bar called with arg a 

आप अपने Foo परिभाषा के भीतर कहीं भी self.__bar उपयोग कर सकते हैं, लेकिन एक बार आप परिभाषा के बाहर हैं, तो आप foo_object._Foo__bar() उपयोग करना होगा। यह वर्ग विरासत के संदर्भ में नेमस्पेस टकराव से बचने में मदद करता है। यदि ऐसा नहीं है कि आप इस सुविधा का उपयोग क्यों कर रहे हैं, तो आप शायद इसे गलत तरीके से उपयोग कर रहे हैं।