isinstance python return 不同的值

isinstance python return different values

我对 isinstance() 在 Python 中的工作方式有点迷惑。我以前用过这个函数,而且行为很清楚,直到现在。

一些上下文。我有一个 class Classifier,它有一个方法 set_kernel,可以将字符串或内核作为参数。我正在从主函数创建一个名为 k 的内核类型的对象。当我使用 isinstance(k, Kernel) 时,答案是 True。但是,如果我将 k 作为参数传递给 classifier,然后我在函数内部进行相同的检查,它 returns False.

关于这里发生的事情有什么线索吗?我附上一些代码片段以使其更清楚:

class Kernel(object):
    pass

class Gaussian(Kernel):
    pass

class Classifier():
    def set_kernel(kernel, *args):
        print isinstance(kernel, Kernel) # This prints False


k = Gaussian() # This is a son of Kernel
print isinstance(k, Kernel) # This prints True

c = Classifier()
c.set_kernel(k) # This prints False, check above

谢谢!

编辑 1:我改进了编码并清理了所有与问题本身无关的东西。

如果您的 set_kernel 函数是 而不是 一个 staticmethod 如果您在实例上调用此函数,则第一个参数是实例。参见示例:

class Classifier():
    def set_kernel(kernel, *args):
        print(kernel)
        print(isinstance(kernel, int))


>>> k = 10
>>> print(k)
10
>>> print(isinstance(k, int))
True

>>> c = Classifier()
>>> c.set_kernel(k)
<__main__.Classifier object at 0x0000020FABD0FDA0>
False

如果你把它变成 staticmethod 它 "works":

class Classifier():
    @staticmethod
    def set_kernel(kernel, *args):
        print(kernel)
        print(isinstance(kernel, int))

>>> k = 10
>>> print(k)
10
>>> print(isinstance(k, int))
True

>>> c = Classifier()
>>> c.set_kernel(k)
10
True

或者如果您不希望它是静态的,请为实例插入另一个参数,通常在参数列表中称为 "self":

class Classifier():
    def set_kernel(self, kernel, *args):
        print(kernel)
        print(isinstance(kernel, int))

您忘记了 self 参数:

class Classifier():
    def set_kernel(kernel, *args):
        print isinstance(kernel, Kernel)

这意味着 kernel 不是内核。作为第一个位置参数,kernel 扮演了 self 的角色,所以它实际上是分类器。您传递给该方法的内核最终成为 args.

的第一个元素