社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

在python中使用getattr

FI-Info • 5 年前 • 1656 次点击  

这个 getattr 函数定义如下:

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

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

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

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

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中。