为什么子类是对象的实例?

时间:2019-05-05 16:59:08

标签: python instance subclass

据我所知,子类应该是object的子类,但是为什么它也是object的实例?

hmank ~ » python
Python 3.7.3 (default, Mar 26 2019, 21:43:19) 
[GCC 8.2.1 20181127] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> class A:
...   pass
... 
>>> isinstance(A, object)
True
>>> issubclass(A, object)
True
>>> 

此外,我在@prosti答案中引用了isinstance

  

Returns a Boolean stating whether the object is an instance or subclass of another object

但是在同一链接上的示例显示了

>>> class Foo: pass
...
>>> class Bar(Foo): pass
...
>>> isinstance(Bar, Foo)
False
>

看来,这意味着 class1 class2 的实例,当且仅当 class2 object,对吗?< / p>

3 个答案:

答案 0 :(得分:1)

在python3中,所有类都是从object派生的

class A(object):
    pass

class A:
    pass

相同。
关于isinstance(A, object)返回True的原因
看到以下代码

class A: 
    @classmethod 
    def do(cls): 
        print(f"hello from {cls.__name__}") 

A.do()                                                                  

# hello from A

答案 1 :(得分:1)

因为python中的所有内容都被视为对象,这是一个更好的说法,每个对象都是python中对象的实例!

考虑到这一点,它就完全有意义了,因为python是一种面向对象的语言,因此,正常的并且期望每个值都是一个对象


In [9]: class A: 
   ...:     pass 
   ...:                                                                                                                                               

In [10]: isinstance(A, object)                                                                                                                        
Out[10]: True

In [11]: isinstance(A(), object)                                                                                                                      
Out[11]: True

In [12]: isinstance(1, object)                                                                                                                        
Out[12]: True

In [13]: isinstance([2,3], object)                                                                                                                    
Out[13]: True

In [14]: isinstance('hello', object)                                                                                                                  
Out[14]: True

答案 2 :(得分:1)

一个不错的问题。

class A:
  pass

a = A()

print(isinstance(a, A)) #True
print(isinstance(object, A)) #False
print(isinstance(A, object)) #True
print(issubclass(A, A)) #True
print(issubclass(A, object)) #True

根据定义,isinstance

  

返回一个布尔值,说明该对象是另一个对象的实例还是子类。

另一方面,issubclass

  

返回Bool类型,指示对象是否为类的子类。

还要补充说明,一个类被视为其本身的子类


更新

  

似乎意味着class1是class2的实例,当且仅当class2是对象时,对吧?

您可以通过测试获得答案,逻辑非常简单。一个类是一个类,对象是一个类的实例。

如果您确实需要了解implementation,可以检查代码。

如果您是极客,也可以找到test cases

在以下示例中,必须实例化该对象以便为True进行分类:

class Foo: pass
class Bar(Foo): pass
print(isinstance(Bar(), Foo)) #True
print(isinstance(Bar(), Bar)) #True

print(Bar) #<class '__main__.Bar'>
print(Bar()) #<__main__.Bar object at 0x7f9fc8f32828>

另外,这里的一些示例是特定于Python3的,如果您是Python2的家伙,则必须知道自己应该更加明确并编写:

class Bar(object): pass

如果您编写Python无关代码,则(object)部分是必须的。 最后检查Standard on Overloading isinstance() and issubclass(),但要记住标准是“实时的”,将来可能会更新。

最后,您可以在类对象关系上检查this