ins*_*get 8 python class isinstance
在我写这篇文章的时候,对我来说,我实际上遇到了这个问题.
我有一个对象列表.这些对象中的每一个都是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
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但仍然可以使用,因为它早于新式类.话虽如此,切换到新式课程是非常明智的.