Python 中的对象可以具有属性——数据属性和与这些(方法)一起工作的函数。实际上,每个对象都有内置属性(在 Python 控制台中尝试dir(None)、dir(True)、dir(...)、dir(dir))。
例如,您有一个对象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 和call them 开头的所有方法。
与getattr 类似,setattr 允许您设置具有其名称的对象的属性:
>>> setattr(person, 'name', 'Andrew')
>>> person.name # accessing instance attribute
'Andrew'
>>> Person.name # accessing class attribute
'Victor'
>>>