पाइथन की वस्तुओं में विशेषताएँ हो सकती हैं - डेटा विशेषताएँ और कार्य उन (विधियों) के साथ काम करने के लिए। दरअसल, प्रत्येक वस्तु में अंतर्निहित विशेषताएं होती हैं।
उदाहरण के लिए आप एक वस्तु है person
, जो कई गुण होते हैं: name
, gender
, आदि
आप का उपयोग इन विशेषताओं (यह तरीकों या डेटा वस्तुओं हो) आम तौर पर लेखन: person.name
, person.gender
, person.the_method()
, आदि
लेकिन क्या होगा यदि आप कार्यक्रम लिखते समय विशेषता के नाम को नहीं जानते हैं? उदाहरण के लिए आपके पास विशेषता का नाम है जिसे चर में संग्रहीत किया जाता है attr_name
।
अगर
attr_name = 'gender'
फिर, लिखने के बजाय
gender = person.gender
तुम लिख सकते हो
gender = getattr(person, attr_name)
कुछ अभ्यास:
Python 3.4.0 (default, Apr 11 2014, 13:05:11)
>>> class Person():
... name = 'Victor'
... def say(self, what):
... print(self.name, what)
...
>>> getattr(Person, 'name')
'Victor'
>>> attr_name = 'name'
>>> person = Person()
>>> getattr(person, attr_name)
'Victor'
>>> getattr(person, 'say')('Hello')
Victor Hello
getattr
AttributeError
दिए गए नाम के साथ विशेषता वस्तु में मौजूद न होने पर उठाएंगे :
>>> getattr(person, 'age')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Person' object has no attribute 'age'
लेकिन आप तीसरे तर्क के रूप में एक डिफ़ॉल्ट मान पारित कर सकते हैं, जो कि यदि ऐसी विशेषता मौजूद नहीं है तो वापस कर दिया जाएगा:
>>> getattr(person, 'age', 0)
0
आप सभी विशेषता नामों पर पुनरावृति getattr
के साथ उपयोग कर सकते हैं dir
और उनके मान प्राप्त कर सकते हैं:
>>> dir(1000)
['__abs__', '__add__', ..., '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
>>> obj = 1000
>>> for attr_name in dir(obj):
... attr_value = getattr(obj, attr_name)
... print(attr_name, attr_value, callable(attr_value))
...
__abs__ <method-wrapper '__abs__' of int object at 0x7f4e927c2f90> True
...
bit_length <built-in method bit_length of int object at 0x7f4e927c2f90> True
...
>>> getattr(1000, 'bit_length')()
10
इसके लिए एक व्यावहारिक उपयोग उन सभी तरीकों को खोजना होगा जिनके नाम उनके साथ शुरू होते हैं test
और उन्हें कॉल करते हैं ।
getattr
वहाँ के समान है setattr
जो आपको एक वस्तु का गुण सेट करने की अनुमति देता है जिसका नाम है:
>>> setattr(person, 'name', 'Andrew')
>>> person.name # accessing instance attribute
'Andrew'
>>> Person.name # accessing class attribute
'Victor'
>>>