isinstance()和issubclass()返回冲突的结果

时间:2011-11-12 20:24:48

标签: python python-2.x

>>> class Hello:
    pass

>>> isinstance(Hello,object)
True
>>> issubclass(Hello,object)
False
>>> a = Hello()
>>> isinstance(a,object)
True

如何解释isinstance(Hello,object)返回 True ,而issubclass(Hello,object)返回错误

4 个答案:

答案 0 :(得分:61)

接受的答案是正确的,但似乎错过了一个重要的观点。内置函数isinstanceissubclass会提出两个不同的问题。

isinstance(object,classinfo)询问 对象 类的实例 (或类的元组)。

issubclass(class,classinfo)询问一个 是否是另一个类(或其他类)的子类。

在任何一种方法中, classinfo 都可以是“类,类型或元组,类和这类元组的类。”

由于类本身就是对象,因此isinstance适用。我们还可以问一个类是否是另一个类的子类。但是,我们不应该期望从这两个问题得到相同的答案。

class Foo(object):
    pass

class Bar(Foo):
    pass

issubclass(Bar, Foo)
#>True
isinstance(Bar, Foo)
#>False

Bar是Foo的子类,而不是它的一个实例。 Bar是 type 的一个实例,它是 object 的子类,因此类Bar是object的实例。

isinstance(Bar, type)
#>True
issubclass(type, object)
#>True
isinstance(Bar, object)
#>True

答案 1 :(得分:21)

这是因为您使用的是旧式类,因此它不是从object派生的。试试这个:

class Hello(object):
    pass

>>> issubclass(Hello,object)
True

不推荐使用旧式类,不应再使用它们了。

在Python 3.x中,所有类都是新式的,不再需要编写(object)

答案 2 :(得分:8)

我的回答与Python 3有关。

为了扩展cbare的答案,下面的代码对我有帮助。

>>> class X:
...     pass
...     
>>> class Y(X):
...     pass
...     
>>> x = X()
>>> y = Y()
>>> isinstance(x, X)  # is object x an instance of class X (or any subclass)?
True
>>> isinstance(x, Y)  # is object x an instance of class Y (or any subclass)?
False
>>> isinstance(y, X)  # is object y an instance of class X (or any subclass)?
True
>>> isinstance(y, Y)  # is object y an instance of class Y (or any subclass)?
True

>>> issubclass(X, X)  # is class X a subclass of X (including class X)?
True
>>> issubclass(X, Y)  # is class X a subclass of Y (including class Y)?
False
>>> issubclass(Y, X)  # is class Y a subclass of X (including class X)?
True
>>> issubclass(Y, Y)  # is class Y a subclass of Y (including class Y)?
True

>>> issubclass(type(x), X)  # is class of object x a subclass of X (including class X)?
True
>>> issubclass(type(x), Y)  # is class of object x a subclass of Y (including class Y)?
False
>>> issubclass(type(y), X)  # is class of object y a subclass of X (including class X)?
True
>>> issubclass(type(y), Y)  # is class of object y a subclass of Y (including class Y)?
True

>>> issubclass(x.__class__, X)  # is class of object x a subclass of X (including class X)?
True
>>> issubclass(x.__class__, Y)  # is class of object x a subclass of Y (including class Y)?
False
>>> issubclass(y.__class__, X)  # is class of object y a subclass of X (including class X)?
True
>>> issubclass(y.__class__, Y)  # is class of object y a subclass of Y (including class Y)?
True

我们可以看到isinstance(object, class)正确地遵循继承/子类。

答案 3 :(得分:0)

因此,基本上,如果对象是some_class的实例化类,则isinstance(new_object,some_class)返回True。换句话说,new_object是some_class()对象。 issubclass检查对象是否具有some_class的子类。

通过一个非常合理的简单示例更好地解释:

Y_pred1 = regressor.predict(Prediction["Adj_Marketing_Expenses"].values.reshape(-1,1).astype(int))

不需要虚假测试来解释这一点。