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
.
的第一个元素
我对 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
.