2

我对isinstance()Python 的工作原理有点迷茫。我以前用过这个函数,行为很清楚,直到现在。

一点上下文。我有一个类Classifier,它有一个set_kernel可以将字符串或内核作为参数的方法。我正在从 main 函数创建一个名为 .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:我改进了编码并清理了所有与问题本身无关的东西。

4

2 回答 2

3

如果您的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))
于 2016-12-08T20:34:20.770 回答
3

你忘记了self论点:

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

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

于 2016-12-08T20:37:46.867 回答