为什么我使用 getattr() 得到无限递归,而不使用 __dict__[]?

Why do I get infinite recursion with getattr(), but not with __dict__[]?

我正在尝试实现自定义 Django 模型字段(受 this blog post 启发),虽然我的代码 运行 没问题,但我对以下代码行很感兴趣:

value = instance.__dict__[self.field_name]

在我看来,这只是一种丑陋的调用方式 getattr()。因此,我将此行更改为以下内容:

value = getattr(instance, self.field_name)

我预计代码会 运行 相同。它没有,因为现在我得到一个无限递归错误:

RuntimeError at /admin/testapp/testmodel/
maximum recursion depth exceeded

为什么我在使用 getattr() 时得到无限递归,而在使用 __dict__[] 时却没有?

--

编辑:这是来自链接博客的模型定义示例 post:

from django.db import models

class Bookmark(models.Model):
    url = models.URLField()

getattr 尝试以任何可能的方式获取属性。这包括调用 __get__。如果您在由 getattr 调用的函数中使用 getattr(具有相同的参数),您将以无限循环结束。直接访问 __dict__ 绕过了这个 "problem".