Python中isinstance()判断Route实例意外返回False问题
为啥
isinstance(default_route, Route)会返回False? 从你贴的调试信息来看,明明default_route.__class__和Route都显示成<class 'route.Route'>,但type(default_route) is Route却返回False,这事儿说穿了就是:内存里其实存在两个完全独立的Route类对象,它们名字和模块路径看起来一模一样,但在Python眼里是完全不同的东西。
大概率是这几个原因导致的:
模块被重复导入了:比如你先是用
import route导入了模块,之后又通过from route import Route或者在调试环境里重新跑了一遍模块代码,结果导致route模块被加载了两次,生成了两个版本的Route类。之前创建的default_route属于第一次加载的类,而你现在用的Route是第二次加载的,自然不匹配。- 解决办法:检查你的导入逻辑,确保整个项目里只以一种方式导入
Route;如果是在交互式调试里遇到的,重启解释器,重新导入模块再创建实例就行。
- 解决办法:检查你的导入逻辑,确保整个项目里只以一种方式导入
调试时重新定义了类:要是你先创建了
default_route实例,之后又重新执行了class Route(object):...这段代码,那新的Route类会覆盖原来的名字,但之前的default_route还是属于旧的那个类,两者自然不匹配。- 解决办法:重新定义类之后,记得重新创建
default_route实例,让它归属于新的类对象。
- 解决办法:重新定义类之后,记得重新创建
模块路径有冲突:比如你的项目里有两个同名的
route模块,或者sys.path被修改过,导致你导入的route不是同一个文件。- 解决办法:你可以打印下
Route.__file__和default_route.__class__.__file__,看看两个类对应的文件路径是不是一致;再检查下sys.path列表,有没有重复或者冲突的路径。
- 解决办法:你可以打印下
快速验证的方法:
你可以打印这两个类对象的内存地址,一眼就能确认是不是两个不同的对象:
print(id(Route)) print(id(default_route.__class__))
如果输出的两个数字不一样,那就实锤了是两个独立的类对象在搞鬼。
内容的提问来源于stack exchange,提问作者W. Sadkin
相关产品推荐
相关产品推荐

