【问题标题】:isinstance python return different valuesisinstance python返回不同的值
【发布时间】:2016-12-08 20:16:19
【问题描述】:

我对@9​​87654321@ 在 Python 中的工作方式有点迷茫。之前用过这个函数,到现在为止,行为还是很清楚的。

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

关于这里发生了什么的任何线索?我附上一些代码 sn-p 以使其更清晰:

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:我已经改进了编码并清理了所有与问题本身无关的东西。

【问题讨论】:

  • 请注意,您可以使用更简单的示例(例如 str 而不是 sl_kernal)来演示此行为。
  • 您发布的代码存在语法错误,无法编译。请发布实际可运行的代码,在运行时实际演示问题。
  • 编辑纠正语法错误

标签: python inheritance isinstance


【解决方案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))

【讨论】:

    【解决方案2】:

    您忘记了 self 参数:

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

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

    【讨论】:

    • 我认为“self”是一个语言关键字,指的是对象,但这与参数中的位置无关。你是对的,谢谢。
    • 它被命名为“self”只是惯例。无论调用什么,Python 总是将它作为第一个位置参数传递(如果在实例上调用它)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2012-05-21
    相关资源
    最近更新 更多