2013-02-08 29 views
9

चलो कहते हैं कि मैं इस वर्ग को परिभाषित करते हैंसेटैटर और गेटैटर व्हाइटसाइट की अनुमति क्यों देता है? मैं तो जैसे गुण सेट कर सकते हैं</p> <pre><code>class A: pass a = A() </code></pre> <p>अब स्पष्ट रूप से:

a.x = 5 

लेकिन setattr के साथ, मैं a गुण जो उनके नाम में खाली स्थान के होते हैं दे सकते हैं।

setattr(a, 'white space', 1) 
setattr(a, 'new\nline', None) 

dir(a)'white space' और 'new\nline' शामिल हैं।

मैं . ऑपरेटर का उपयोग इन विशेषताओं उपयोग नहीं कर सकते, क्योंकि यह एक SyntaxError को जन्म देती है:

>>> a.white space 
    File "<interactive input>", line 1 
    a.white space 
       ^
SyntaxError: invalid syntax 
>>> a.new\nline 
    File "<interactive input>", line 1 
    a.new\nline 
      ^
SyntaxError: unexpected character after line continuation character 

मैं getattr साथ कर सकते हैं लेकिन:

>>> getattr(a, 'white space') 
1 
>>> getattr(a, 'new\nline') 
None 

वहाँ इस कार्यक्षमता के पीछे एक कारण है? यदि ऐसा है, तो ये क्या है?

क्या हमें इसका उपयोग करना चाहिए, या पीईपी 8 में परिभाषित मानकों के अनुरूप होना चाहिए?

उत्तर

8

ऑब्जेक्ट विशेषताएँ केवल उन गुणों को परिभाषित करती हैं जो किसी ऑब्जेक्ट के __dict__ में परिभाषित होती हैं। यदि आप उस परिप्रेक्ष्य से इसके बारे में सोचते हैं तो एक विशेषता नाम में व्हाइटस्पेस (या किसी भी अन्य चरित्र को str में शामिल किया जा सकता है) को कुल समझ में आता है।

>>> class X(object): 
... pass 
... 
>>> x = X() 
>>> setattr(x, 'some attribute', 'foo') 
>>> x.__dict__ 
{'some attribute': 'foo'} 
>>> x.__dict__['some attribute'] 
'foo' 

कहा, के रूप में दुभाषिया कैसे संपत्ति tokenize (पार्स) कार्यक्रम स्रोत के लिए पता नहीं होगा अजगर की भाषा वाक्यविन्यास प्रत्यक्ष विशेषता संदर्भ में खाली स्थान के लिए अनुमति नहीं कर सकते हैं। मैं attribute names का उपयोग करना चाहता हूं जिसे प्रत्यक्ष विशेषता संदर्भ के माध्यम से एक्सेस किया जा सकता है जबतक कि आपको पूरी तरह से अन्यथा करने की आवश्यकता न हो।

+1

यह डैश और अन्य पात्रों को प्रत्यक्ष विशेषताओं के रूप में मान्य नहीं होने देता है। वास्तव में –

+2

। विशेषता नाम केवल एक स्ट्रिंग है जो एक तीर कुंजी करता है। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^