gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:22:42 28 4
gpt4 key购买 nike

在我写这篇文章时,我真的遇到了这个问题,这对我来说几乎是超现实的。

我有一个对象列表。这些对象中的每一个都是我编写的 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 类以某种方式被创建了两次。您使用一个版本的 Instance 创建了 pop[0],并正在检查另一个版本的实例。尽管它们几乎完全相同,但 Python 并不知道这一点,因此 isinstance 失败了。要验证这一点,请检查 pop[0].__class__ is Individual 是否计算为 false。

通常类不会创建两次(除非您使用 reload),因为模块只导入一次,并且所有类对象有效地保持单例。但是,使用包和相对导入可能会留下一个陷阱,导致模块被导入两次。当脚本(以 python bla 开头,而不是使用 import bla 从另一个模块导入)包含相对导入时,就会发生这种情况。运行脚本时,python 不知道它的导入引用了 Genetic 包,因此它以绝对方式处理它的导入,创建一个顶级 individual 模块及其拥有 individual.Individual 类。另一个模块正确地导入了 Genetic 包,最终导入了 Genetic.individual,这导致了二重身 Genetic.individual.Individual 的创建>.

要解决此问题,请确保您的脚本仅使用绝对导入,例如 import Genetic.individual,即使像 import individual 这样的相对导入似乎只是工作美好的。如果您想节省打字时间,请使用 import Genetic.individual as individual。另请注意,尽管您使用旧式类,isinstance 应该仍然有效,因为它早于新式类。话虽如此,强烈建议切换到新式类。

关于python - 正确使用 `isinstance(obj, class)`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13039060/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com