>>> class Hello:
pass
和
>>> isinstance(Hello,object)
True
>>> issubclass(Hello,object)
False
>>> a = Hello()
>>> isinstance(a,object)
True
你怎么解释isinstance(Hello,object)
返回True而issubclass(Hello,object)
返回False
这是因为你使用旧式的类,所以它不是从object
派生的。试试这个:
class Hello(object):
pass
>>> issubclass(Hello,object)
True
旧式类已弃用,您不应再使用它们。
在Python 3.x中,所有类都是新式的,不再需要编写(object)
。
接受的答案是正确的,但似乎错过了重要的一点。内置函数isinstance和issubclass提出了两个不同的问题。
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是类型的实例,它是object的子类,因此类Bar是object的实例。
isinstance(Bar, type)
#>True
issubclass(type, object)
#>True
isinstance(Bar, object)
#>True
我的回答与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)
正确地尊重继承/子类。