为什么我使用 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".
我正在尝试实现自定义 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".