Python Django模型实例非零覆盖被忽略
我试图覆盖一个模型实例的Python Django模型实例非零覆盖被忽略,python,django,django-reversion,Python,Django,Django Reversion,我试图覆盖一个模型实例的\uuuu非零,因此它的计算结果为False 我首先在一个简单的Python类上进行了测试: >>> class A(): ... pass ... >>> a = A() >>> a.__nonzero__ = lambda: False >>> b = A() >>> bool(a) False >>> bool(b) True >>>
\uuuu非零
,因此它的计算结果为False
我首先在一个简单的Python类上进行了测试:
>>> class A():
... pass
...
>>> a = A()
>>> a.__nonzero__ = lambda: False
>>> b = A()
>>> bool(a)
False
>>> bool(b)
True
>>> type(a).__nonzero__(a)
False
>>> type(b).__nonzero__(b)
True
这表明被覆盖的\uuu非零
成功地改变了对象的bool()
计算
然后我尝试将同样的东西应用到django模型对象(本身从'django.db.models.Manager'继承的feincms.module.page.page
实例)
但其计算结果为True
:
(Pdb) obj
<Page: test>
(Pdb) bool(obj)
True
(Pdb)obj
(Pdb)布尔(obj)
真的
是否有我不知道的可能导致这种行为的原因?在本例中,您使用的是旧式类。模型实例是一个新型的类
class B(object): pass
b = B()
b.__nonzero__ = lambda: False
bool(b) # True
显然,您不能覆盖实例的特殊方法,只能覆盖类型
B.__nonzero__ = lambda self: False
bool(b) # False
阅读以下SO问题以获取示例和更详细的解释:这很不幸。不过谢谢你的回答,我不知道旧/新风格的课程有什么不同。我最终以另一种方式解决了我的问题(我想这比重写表单方法要好得多)。
B.__nonzero__ = lambda self: False
bool(b) # False