正确使用`isinstance(obj,class)`

ins*_*get 8 python class isinstance

在我写这篇文章的时候,对我来说,我实际上遇到了这个问题.

我有一个对象列表.这些对象中的每一个都是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
Run Code Online (Sandbox Code Playgroud)

我很难过!是什么赋予了?

编辑:我的个人课程

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
Run Code Online (Sandbox Code Playgroud)

use*_*342 14

此错误表示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但仍然可以使用,因为它早于新式类.话虽如此,切换到新式课程是非常明智的.