繁体   English   中英

isinstance python返回不同的值

[英]isinstance python return different values

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

您忘记了self争论:

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

这意味着kernel不是内核。 作为第一个位置参数, kernel充当self的角色,因此它实际上是分类器。 传递给该方法的内核最终成为args的第一个元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM