python - isinstance python返回不同的值

标签 python inheritance isinstance

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

一些上下文。我有一个 Classifier 类,它有一个方法 set_kernel 可以将字符串或内核作为参数。我正在从主函数创建一个名为 k 的内核类型对象。当我使用 isinstance(k, Kernel) 时,答案是 True。但是,如果我将 k 作为参数传递给分类器,然后在函数内部进行相同的检查,它会返回 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,它“有效”:

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))

关于python - isinstance python返回不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41048074/

相关文章:

java - Maven 包含父类

python - 使用 isinstance 比较 boolean 和 int

python - flask : 'Token' object has no attribute 'test' | render_template error

python - 在 python 中本地进行 Itunes iap 收据验证。

python - 如何使用 Django Rest Framework 修补单个字段?

perl - 如果已经有 'use'语句,是否需要使用 'use base'

php - Doctrine DQL、类表继承和访问子类字段

python - 如何找到列表S的所有分区为k个子集(可以为空)?

python - isinstance(False, int) 返回 True

python - 在Python中,isinstance()可以用来检测类方法吗?