您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python-到底什么是getattr(),我该如何使用它?

Python-到底什么是getattr(),我该如何使用它?

getattr(object, 'x') 完全等同于object.x

有只有两个原因使用它:

你无法编写object.x,因为你事先不知道想要哪个属性(它来自字符串)。对于元编程非常有用。 你想要提供一个认值。如果没有object.y则将引发一个。但是会回来的。AttributeErrorygetattr(object, 'y', 5)5

Python中的对象可以具有属性-数据属性和与之配合使用的方法方法)。实际上,每个对象都有内置的属性

例如你有一个对象person一个具有多个属性name,gender,等。

你可以访问这些属性(无论是方法或数据对象),通常写作:person.name,person.genderperson.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

getattrAttributeError如果对象中不存在具有给定名称属性,则将引发:

>>> 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'
>>>
python 2022/1/1 18:19:24 有608人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶