The getattr
函数定义如下:
getattr(对象, 名称[ 默认])
返回对象的命名属性的值。名称必须是字符串。如果字符串是对象属性之一的名称,则结果是该属性的值。例如,getattr(x, 'foobar')
相当于x.foobar
。如果指定的属性不存在,则返回默认值(如果提供),否则返回AttributeError
被提出。
哪种方法可以做到getattr()
称呼?例如,它是否调用:
__getattr__
__get__
__getattribute__
- 还有什么吗?
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__
约定是使用getattr()
仅当您在编译时不知道属性名称应该是什么时。如果这样做,则使用点运算符(“显式优于隐式”...)。
正如 @Klaus D. 在评论中提到的,python 数据模型文档 https://docs.python.org/3/reference/datamodel.html#object.__getattr__更详细地介绍如何.__getattribute__()
and .__getattr__()
相互影响。可以说,从较高的层面来看,如果前者失败,后者是一种后备选择。注意.__getattr__()
和内置的getattr()
没有直接关系 - IIRC 这是一个命名的怪癖,起源于 python 的早期版本,并被继承到 python 3 中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)