6

मैं एक सजावट लिख रहा था जिसे निजी चरों तक पहुंचने की आवश्यकता है और यह विसंगति मिली है। क्या कोई इसे समझा सकता है?पायथन "निजी" नाम मैंगलिंग और इंस्टेंस बनाम क्लास गुण

(अजगर 2.5)

नामकरण काम करता है mangling के रूप में विशेषताओं वर्ग में परिभाषित के लिए उम्मीद:

उदाहरण विशेषताओं के काम नहीं है (और इस तरह से हम इसे सही करने के लिए की अपेक्षा की जाती है?)

>>> class Tester(object): 
...  def __init__(self): 
...   self.__foo = "hi" 

>>> t = Tester() 
>>> t._Tester__foo 
AttributeError: 'Tester' object has no attribute '_Tester__foo' 

पीएस क्या इनके लिए सही शब्द "वर्ग विशेषता" है? वे स्थिर नहीं होते हैं, लेकिन अगर आप उन में से एक एक सूची, या कुछ अन्य परिवर्तनशील प्रकार बनाने के लिए, यह साझा किया जाता है ...

अद्यतन

वास्तव में, दूसरा उदाहरण, ठीक काम करता है भी। यह एक हार्डवेयर मुद्दा था (मदद पुनरारंभ)।

+2

कक्षा विशेषता सही शब्द है। और वे * हमेशा * साझा किए जाते हैं। व्यवहार्यता कोई फर्क नहीं पड़ता। जब आप किसी दिए गए ऑब्जेक्ट को म्यूट कर सकते हैं तो यह पूछने के अलावा, यह बहुत महत्वपूर्ण नहीं है। – delnan

+0

क्या मैं इस सवाल को निंदा कर सकता हूं? या क्या कोई इसे रखने में मूल्य देखता है? मैं अपने मूल मुद्दे को पुन: उत्पन्न नहीं कर सकता। ऐसा लगता है कि यह उम्मीद के रूप में काम करता है। – Rafe

+1

इसके बजाय इसे छोड़ दें, क्योंकि @MartijnPieters कई पायथन परीक्षणों में इस मुद्दे का परीक्षण करने के लिए सभी तरह से चला गया। – jsbueno

उत्तर

9

वास्तव में सही नहीं है।

वर्ग निर्माण समय पर नाम उलझन में होता है; किसी भी फ़ंक्शन जो उलझन वाले नामों को संदर्भित करता है, भी समायोजित किए जाते हैं।

मैं अपने उदाहरण पुन: पेश नहीं कर सकते हैं, कम से कम में नहीं अजगर संस्करण 2.4, 2.5, 2.6, 3.1 और 3.2 मैक पर:

>>> class Tester(object): 
...  def __init__(self): 
...   self.__foo = "hi" 
... 
>>> Tester()._Tester__foo 
'hi' 
>>> Tester().__foo 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'Tester' object has no attribute '__foo' 

आप समारोह बाईटकोड आप नाम देख सकते हैं एकत्रित न तो घायल कर दिया गया है साथ ही:

>>> import dis 
>>> dis.dis(Tester.__init__) 
    3   0 LOAD_CONST    1 ('hi') 
       3 LOAD_FAST    0 (self) 
       6 STORE_ATTR    1 (_Tester__foo) 
       9 LOAD_CONST    0 (None) 
      12 RETURN_VALUE   

मैं compiler source और सभी नाम देख लिया है mangler, एक कोड रास्ता है कि कम से कम 2002 के बाद से ही बनी हुई है के माध्यम से चलाए जा रहे हैं।

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

+0

3.2 के साथ भी काम करता है। – delnan

+0

आप सही हैं। मुझे नहीं पता कि वहां क्या हुआ। मैं अपने कंप्यूटर को पुनरारंभ करना चाहता हूं, इसलिए मुझे इसे एक आईटी मुद्दा कहना होगा, "क्या आपने इसे बंद करने की कोशिश की है?" ;) – Rafe