在撰写本文时,我实际上遇到了这个问题,这似乎对我来说是超现实的。

我有一个对象列表。每个对象都是我编写的Individual类的实例。

因此,传统观点认为isinstance(myObj, Individual)应该返回True。但是,事实并非如此。因此,我认为我的编程中存在一个错误,并打印了type(myObj),令我惊讶的是,打印的instancemyObj.__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应该仍然有效,因为它早于新式类。话虽如此,强烈建议改用新型类。

10-06 13:01