python - 检查某个模型实例是否实际上是某个模型的实例的最佳方法
问题描述
我正在尝试编写一个类,该类将我的应用程序中的模型实例作为其__init__
. 在阅读该主题时,我偶然发现了这个问题:django:从该模型的实例中获取模型的最佳实践方法,它认为简单地使用type(instance)
将是最好的方法。尽管立即使用它可能很诱人,但使用不是isinstance(instance, model)
更好的解决方案吗?比如说(来自我自己的代码):
from app_name.models import Model1, Model2, ... ModelN
MODELS = (Model1, Model2 ... ModelN)
然后在类本身(在我的例子中,Graph)中,执行以下操作:
class Graph():
model_instance = None
model = None
def __init__(self, model_instance):
if isinstance(model_instance, MODELS):
for a_model in MODELS:
if isinstance(model_instance, a_model):
self.model = a_model
self.model_instance = model_instance
...
作为初学者,我认为这是我能想到的最好方法,但也假设有更顺畅/更好的方法来做到这一点。可能是一种更“可读”的方式?优点?缺点?
感谢所有对此的反馈!谢谢!
对这个问题的整个上下文感兴趣的人,请查看我在 GitHub 上的项目:https ://github.com/VBoB13/TeachAdmin 您可以在此处找到包含上述代码的文件:https ://github.com/VBoB13/TeachAdmin /blob/master/teachadmin/graph.py
解决方案
从 isinstance
文档
如果 object 参数是 classinfo 参数或其(直接、间接或虚拟)子类的实例,则返回 True。如果 object 不是给定类型的对象,则该函数始终返回 False。如果 classinfo 是类型对象的元组(或递归地,其他此类元组),如果 object 是任何类型的实例,则返回 True。如果 classinfo 不是类型或类型的元组和此类元组,则会引发 TypeError 异常。
这意味着如果您的模型是另一个模型的子类,它们都将被标记为超类的实例
例如 :
class A(object):
pass
class B(A):
pass
a = A()
b = B()
print(isinstance(b,A))
# True
print(type(b)==type(A())
# False
总之,您应该使用type()
,因为在 Django 中有多种使用模型继承的方法,这可能会产生错误的类型类结果
推荐阅读
- spring - 使用 Hystrix 断路器暂停/恢复 JMS 侦听器
- ruby-on-rails - 使用 Active Storage 对图像进行排序
- python - 用分类变量绘制箱线图
- google-sheets - 如何在谷歌表格上为条件 IF 添加多个数字?
- javascript - cgi 和现代 javascript 用法的区别
- docker - 将 Kubernetes 中的端口映射到两个 Flask 应用程序(前端和后端)
- integer - 引用和不引用之间的流口水整数类型差异
- excel - 如何将动态/VBA 生成的范围放入单元格的公式中?
- python - 我的函数应该返回匹配的值对,但返回一对匹配和一对不匹配
- google-chrome - 如何为 Media Source Extension API 创建视频和音频文件?