आप प्रोग्रामेटिक रूप से एक विशेषता कैसे सेट करते हैं?


204

मान लीजिए कि मेरे पास एक अजगर वस्तु xऔर एक स्ट्रिंग है s, तो मैं विशेषता sको कैसे सेट करूं x? इसलिए:

>>> x = SomeObject()
>>> attr = 'myAttr'
>>> # magic goes here
>>> x.myAttr
'magic'

क्या जादू है? संयोग से, इसका लक्ष्य कॉल को कैश करना है x.__getattr__()

जवाबों:


288
setattr(x, attr, 'magic')

इस पर मदद के लिए:

>>> help(setattr)
Help on built-in function setattr in module __builtin__:

setattr(...)
    setattr(object, name, value)

    Set a named attribute on an object; setattr(x, 'y', v) is equivalent to
    ``x.y = v''.

संपादित करें: हालांकि, आपको ध्यान देना चाहिए (जैसा कि एक टिप्पणी में बताया गया है) जो आप "शुद्ध" उदाहरण के लिए नहीं कर सकते object। लेकिन यह संभावना है कि आपके पास ऑब्जेक्ट का एक सरल उपवर्ग है जहां यह ठीक काम करेगा। मैं ओपी से दृढ़तापूर्वक आग्रह करूंगा कि इस तरह की वस्तु का उदाहरण कभी न दें।


12
सावधान, हालांकि, यह आपके परिदृश्य में काम नहीं करता है जहां आप ऑब्जेक्ट () का एक उदाहरण बना रहे हैं।
S.Lott

3
बिल्कुल सही है, यह नहीं है। मैंने आसानी से उस पर ध्यान नहीं दिया। मैं ओपी से आग्रह करूंगा कि वह कभी भी इस तरह की वस्तु का उदाहरण न दें।
अली अफशार

2
लानत शर्म की बात है कि यह सभी मामलों में काम नहीं करता है, क्योंकि यह वास्तव में उपयोगी होगा, उदाहरण के लिए, dirtyउपयोगकर्ता इनपुट में विशेषता जोड़ने के लिए ...
brice

1
@Brice: setattr लगभग सभी मामलों में काम करता है। दक्षता और अन्य कारणों के लिए, 'ऑब्जेक्ट' को क्रमादेशित किया जाता है ताकि आप इसमें अतिरिक्त विशेषताएँ न जोड़ सकें। आप __slots__विशेषता के साथ अपनी कक्षा के साथ ऐसा कर सकते हैं ।
dirkjot

4
यह भी काम नहीं करता है int। क्या आप व्यख्या कर सकते हैं? (यह सब पर है __builtin__?
जेन्स टिम्मरमैन

53

आमतौर पर, हम इसके लिए कक्षाएं परिभाषित करते हैं।

class XClass( object ):
   def __init__( self ):
       self.myAttr= None

x= XClass()
x.myAttr= 'magic'
x.myAttr

हालाँकि, आप कर सकते हैं, एक हद तक, में setattrऔर getattrनिर्मित कार्यों के साथ ऐसा करते हैं। हालाँकि, वे objectसीधे उदाहरणों पर काम नहीं करते हैं।

>>> a= object()
>>> setattr( a, 'hi', 'mom' )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'hi'

हालाँकि, वे सभी प्रकार के साधारण वर्गों पर काम करते हैं।

class YClass( object ):
    pass

y= YClass()
setattr( y, 'myAttr', 'magic' )
y.myAttr

25
वस्तु के उदाहरणों () के साथ काम नहीं करने पर कोई अंतर्दृष्टि क्यों?
मेवोप्लप



1
क्या मैं कक्षाओं के बजाय मॉड्यूल के साथ ऐसा कर सकता हूं?
बोनोबो

21

चलो x एक वस्तु है तो आप इसे दो तरीके से कर सकते हैं

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