isinstance函数的奇怪行为

时间:2014-12-14 06:04:40

标签: python python-3.x isinstance

我在模块Factorhttps://github.com/pgmpy/pgmpy/blob/dev/pgmpy/factors/Factor.py)中有一个名为Factor.py的类,并且在factor_product中也有一个名为Factor.py的函数:

def factor_product(*args):
    if not all(isinstance(phi, Factor) for phi in args):
            raise TypeError("Input parameters must be factors")
    return functools.reduce(lambda phi1, phi2: _bivar_factor_operation(phi1, phi2,     
                                                            operation='M'), args)

现在,如果我将Factor的实例传递给该函数,它仍会抛出TypeError。调试器的几行,断点设置在if语句的上方:

(Pdb) args
args = (<pgmpy.factors.Factor.Factor object at 0x7fed0faf76a0>, <pgmpy.factors.Factor.Factor object at 0x7fed0faf7da0>)

(Pdb) isinstance(args[0], Factor)
False

(Pdb) type(args[0])
<class 'pgmpy.factors.Factor.Factor'>

(Pdb) Factor
<class 'pgmpy.factors.Factor.Factor'>

知道为什么会这样吗?

2 个答案:

答案 0 :(得分:6)

reload是一个很好的方法,可以从同一个模块中获得同一个类的两个副本:一个来自重新加载之前(如果该类的任何实例仍在潜伏着),另一个来自之后。< / p>

很可能你有新类型的对象,但是Factor引用了旧类型,因为它是在不久前导入的。因此,无论如何,您的对象不是Factor的实例,而不是 Factor的实例,这是完全正确的。

永远不要相信reload。 :)

答案 1 :(得分:0)

As isinstance如果object参数是classinfo参数的实例,或者是(直接,间接或虚拟)子类的实例,则返回true,如果将类的实例传递给它,则返回true 不是班级本身,请参阅以下示例:

>>> class A :
...  pass
... 
>>> isinstance(A,A)
False
>>> isinstance(A(),A)
True
>>> z=A()
>>> isinstance(z,A)
True