在撰写本文时,我实际上遇到了这个问题,这似乎对我来说是超现实的。
我有一个对象列表。每个对象都是我编写的Individual
类的实例。
因此,传统观点认为isinstance(myObj, Individual)
应该返回True
。但是,事实并非如此。因此,我认为我的编程中存在一个错误,并打印了type(myObj)
,令我惊讶的是,打印的instance
和myObj.__class__
给了我Individual
!
>>> type(pop[0])
<type 'instance'>
>>> isinstance(pop[0], Individual) # with all the proper imports
False
>>> pop[0].__class__
Genetic.individual.Individual
我很沮丧!是什么赋予了?
编辑:我的个人类(class)
class Individual:
ID = count()
def __init__(self, chromosomes):
self.chromosomes = chromosomes[:] # managed as a list as order is used to identify chromosomal functions (i.e. chromosome i encodes functionality f)
self.id = self.ID.next()
# other methods
最佳答案
此错误表明Individual
类以某种方式被创建了两次。您使用一种版本的pop[0]
创建了Instance
,并且正在使用另一种版本进行检查。尽管它们几乎完全相同,但是Python不知道,并且isinstance
失败。要验证这一点,请检查pop[0].__class__ is Individual
是否评估为false。
通常,类不会被创建两次(除非您使用reload
),因为模块仅被导入一次,并且所有类对象实际上都是单例。但是,使用包和相对导入会留下陷阱,导致模块两次导入。当脚本(以python bla
开头,而不是使用import bla
从另一个模块导入)包含相对导入时,就会发生这种情况。在运行脚本时,python不知道其导入引用了Genetic
包,因此它以绝对方式处理其导入,从而创建了具有自己的individual
类的顶级individual.Individual
模块。另一个模块正确导入了Genetic
包,最终导入了Genetic.individual
,这导致了doppelganger Genetic.individual.Individual
的创建。
要解决此问题,即使相对导入(例如import Genetic.individual
)看起来工作正常,也要确保您的脚本仅使用绝对导入,例如import individual
。而且,如果您想节省输入内容,请使用import Genetic.individual as individual
。还要注意,尽管使用了旧式类,但isinstance
应该仍然有效,因为它早于新式类。话虽如此,强烈建议改用新型类。