Py学习  »  Python

在python中使用getattr

FI-Info • 6 年前 • 1929 次点击  

这个 getattr 函数定义如下:

getattr(对象,名称[,默认])

返回对象的命名属性的值。名称必须是字符串。如果字符串是其中一个对象属性的名称,则结果是该属性的值。例如, getattr(x, 'foobar') 相当于 x.foobar 是的。如果命名属性不存在,则如果提供,则返回默认值,否则为 AttributeError 是升起的。

哪种方法可以 getattr() 打电话?例如,它是否调用:

  • __getattr__
  • __get__
  • __getattribute__
  • 还有别的吗?
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/47780
文章 [ 1 ]  |  最新文章 6 年前
Green Cloak Guy
Reply   •   1 楼
Green Cloak Guy    6 年前

getattr() 转到 __getattribute__() 首先,与点运算符相同:

>>> class A:
...     def __getattr__(self, obj):
...         print("Called __getattr__")
...         return None
...     def __getattribute__(self, obj):
...         print("Called __getattribute__")
...         return None
...     def __get__(self, obj):
...         print("Called __get__")
...         return None
... 
>>> a = A()
>>> a.foobar
Called __getattribute__
>>> getattr(a, 'foobar')
Called __getattribute__

惯例是使用 获取属性() 只有在编译时不知道属性名应该是什么的时候。如果你这样做了,那么使用点运算符(“显式优于隐式”…)。

正如@klaus d.在评论中提到的, the python Data Model documentation 更详细地说明 .__getattribute__() .__getattr__() 互动。可以说,在高水平上,后者是一种退却的选择,因为如果前者失败了。请注意 .\uu getattr_uuu() 以及内置的 获取属性() 不是直接相关的-iirc这是一个命名的怪癖,起源于早期版本的python,并被赋予到python 3中。