I was reading about the
getattr() function. The problem is that I still can't grasp the idea of its usage. The only thing I understand about
getattr() is that
getattr(li, "pop") is the same as calling
I didn't understand when the book mentioned how you use it to get a reference to a function without knowing its name until run-time. Maybe this is me being a noob in programming, in general. Could anyone shed some light to the subject? When and how do I use this exactly?
getattr(object, 'x') is completely equivalent to
There's only two cases where
getattr can be useful.
object.x, because you don't know in advance which attribute you want (it comes from a string). very useful for meta-programming.
object.ywill raise an
AttributeErrorif there's no
getattr(object, 'y', 5)will return
Objects in Python can have attributes -- data attributes and functions to work with those (methods). Actually, every object has built-in attributes.
For example you have an object
person, that has several attributes:
You access these attributes (be it methods or data objects) usually writing:
But what if you don't know the attribute's name at the time you write the program? For example you have attribute's name stored in a variable called
attr_name = 'gender'
then, instead of writing
gender = person.gender
you can write
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 will raise
AttributeError if attribute with the given name does not exist in the object:
>>> getattr(person, 'age') Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Person' object has no attribute 'age'
But you can pass a default value as the third argument, which will be returned if such attribute does not exist:
>>> getattr(person, 'age', 0) 0
You can use
getattr along with
dir to iterate over all attribute names and get their values:
>>> 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
A practical use for this would be to find all methods whose names start with
test and call them.
>>> setattr(person, 'name', 'Andrew') >>> person.name # accessing instance attribute 'Andrew' >>> Person.name # accessing class attribute 'Victor' >>>