उस विशेषता के नाम के अनुरूप दी गई वस्तु विशेषता तक कैसे पहुँचें


153

आप tद्वारा दी गई विशेषताओं के मूल्यों को कैसे सेट / प्राप्त करते हैं x?

class Test:
   def __init__(self):
       self.attr1 = 1
       self.attr2 = 2

t = Test()
x = "attr1"

जवाबों:


284

निर्मित कार्य हैं getattrऔर कहा जाता हैsetattr

getattr(object, attrname)
setattr(object, attrname, value)

इस मामले में

x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)

12
विशेषताओं को हटाने के लिए डेल्टा भी है, लेकिन इसका उपयोग शायद ही कभी किया जाता है।
डेव किर्बी

11
और उस परीक्षण के लिए hasattr है कि किसी ऑब्जेक्ट में कोई विशिष्ट एट्री है या नहीं, हालांकि उस मामले में तीन तर्क फॉर्म getattr (ऑब्जेक्ट, attrname, डिफ़ॉल्ट) का उपयोग करना अक्सर बेहतर होता है।
डंकन

वैसे भी हम getattr का उपयोग इस तरह से कर सकते हैं और कह सकते हैं कि मेरे पास एक डेटाफ्रेम है df1, और एक चर x = 'df1'यानी df1 जो कि var x में एक स्ट्रिंग के रूप में है। मैं इस तरह डीएफ के आकार को मुद्रित करना चाहता हूं, getattr(x, 'shape')या getattr('df1', 'shape')। मुझे पता है कि यह गेटअटर, किसी भी अन्य तरीकों से नहीं किया जा सकता है।
०५:५० पर Ihowerower

3

नोट: यह उत्तर बहुत पुराना है। यह 2008 में हटाए गए newमॉड्यूल का उपयोग करके पायथन 2 पर लागू होता है ।

कार्य सेटट्रा और गेटैट्र में निर्मित अजगर है। जिसका उपयोग किसी वर्ग की विशेषता को सेट और प्राप्त करने के लिए किया जा सकता है।

एक संक्षिप्त उदाहरण:

>>> from new import  classobj

>>> obj = classobj('Test', (object,), {'attr1': int, 'attr2': int}) # Just created a class

>>> setattr(obj, 'attr1', 10)

>>> setattr(obj, 'attr2', 20)

>>> getattr(obj, 'attr1')
10

>>> getattr(obj, 'attr2')
20

0

यदि आप तर्क को कक्षा के अंदर छिपाए रखना चाहते हैं, तो आप सामान्यीकृत गेटर विधि का उपयोग करना पसंद कर सकते हैं:

class Test:
    def __init__(self):
        self.attr1 = 1
        self.attr2 = 2

    def get(self,varname):
        return getattr(self,varname)

t = Test()
x = "attr1"
print ("Attribute value of {0} is {1}".format(x, t.get(x)))

आउटपुट:

Attribute value of attr1 is 1

एक और apporach जो इसे और भी बेहतर तरीके से छिपा सकता है __getattribute__, वह है मैजिक विधि का उपयोग करना , लेकिन मुझे एक अंतहीन लूप मिलता रहा जिसे मैं हल करने में असमर्थ था जब मैं उस विधि के अंदर मौजूद विशेषता मान को प्राप्त करने की कोशिश कर रहा था।

यह भी ध्यान दें कि आप वैकल्पिक रूप से उपयोग कर सकते हैं vars()। उपरोक्त उदाहरण में, आप का विनिमय कर सकते getattr(self,varname)द्वारा return vars(self)[varname], लेकिन getattrका जवाब के अनुसार बेहतर हो सकता है क्या बीच का अंतर है varsऔर setattr?

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