Python中的类型和类

Python中的类型和类,python,class,types,Python,Class,Types,我对Python中的类型和类有点困惑。例如,以下REPL对话让我感到困惑: >>> class A: pass ... >>> a = A() >>> type(a) <type 'instance'> >>> a.__class__ <class __main__.A at 0xb770756c> >>> type([]) <type 'list'> >>

我对Python中的类型和类有点困惑。例如,以下REPL对话让我感到困惑:

>>> class A: pass
... 
>>> a = A()
>>> type(a)
<type 'instance'>
>>> a.__class__
<class __main__.A at 0xb770756c>
>>> type([])
<type 'list'>
>>> [].__class__
<type 'list'>
>>> type(list)
<type 'type'>
>>> list.__class__
<type 'type'>
>>> type(A)
<type 'classobj'>
>>> A.__class__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: class A has no attribute '__class__'
>A类:合格
... 
>>>a=a()
>>>类型(a)
>>>一节课__
>>>类型([])
>>>[]。\uuu类__
>>>类型(列表)
>>>列表__
>>>类型(A)
>>>一节课__
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:类A没有属性“\uuuuu class\uuuuuuu”
  • 为什么内置内容的类型和类(如此处的列表)相同,但用户类/类型不同
  • 不是每个类都是其他类的实例(比如Java中的类)吗?为什么用户定义的类没有
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

  • 如有任何解释/进一步阅读可澄清此行为,将不胜感激。TIA.

    您遇到了新样式类与经典类的不同行为。要进一步阅读,请阅读以下内容:。具体阅读关于课程以及新风格和经典课程之间的差异的部分

    尝试在REPL中键入以下内容:

    class A: pass
    class B(object): pass
    
    你会发现你得到了不同的结果。在这里,您将讨论新样式和旧样式类之间的差异。使用Python 2.6.1,我得到了以下结果:

    > type(A)
    <type "classobj">
    > type(B)
    <type "type">
    
    与我们的
    B类(对象)相同:通过
    结果。而且

    > c = []
    > type(c)
    <type "list">
    
    >c=[]
    >类型(c)
    
    它告诉你的是对象的实例,而不是它的定义。

    这是“物理原因”。或者可能是“历史性的”。在Python 3中,这一切都是固定的:

    >>> class A: pass
    ... 
    >>> a = A()
    >>> type(a)
    <class '__main__.A'>
    >>> a.__class__
    <class '__main__.A'>
    >>> type([])
    <class 'list'>
    >>> [].__class__
    <class 'list'>
    >>> type(list)
    <class 'type'>
    >>> list.__class__
    <class 'type'>
    >>> type(A)
    <class 'type'>
    >>> A.__class__
    <class 'type'>
    >>> class B(object): pass
    ... 
    >>> type(B)
    <class 'type'>
    >>> b = B()
    >>> type(b)
    <class '__main__.B'>
    
    >A类:合格
    ... 
    >>>a=a()
    >>>类型(a)
    >>>一节课__
    >>>类型([])
    >>>[]。\uuu类__
    >>>类型(列表)
    >>>列表__
    >>>类型(A)
    >>>一节课__
    >>>B类(对象):通过
    ... 
    >>>类型(B)
    >>>b=b()
    >>>类型(b)
    
    在Python 3.0中,用户定义的类对象是名为type的对象的实例, 这本身就是一个类。 •在Python 2.6中,新样式的类继承自object,object是类型的子类;
    •经典类是类型的实例,不是从类创建的。

    您应该使用
    类a(对象)
    定义类。然后你会得到
    类型(a)
    。似乎我的错误是没有使用新的类型类,结果给了我奇怪的结果(当然是为了向后兼容)。链接看起来很有趣。谢谢,很高兴知道。没有意识到Python 3已经解决了这个问题。那么,我假设所有类,不管是否显式地从
    object
    派生,都从
    object
    派生,那么?
    >>> class A: pass
    ... 
    >>> a = A()
    >>> type(a)
    <class '__main__.A'>
    >>> a.__class__
    <class '__main__.A'>
    >>> type([])
    <class 'list'>
    >>> [].__class__
    <class 'list'>
    >>> type(list)
    <class 'type'>
    >>> list.__class__
    <class 'type'>
    >>> type(A)
    <class 'type'>
    >>> A.__class__
    <class 'type'>
    >>> class B(object): pass
    ... 
    >>> type(B)
    <class 'type'>
    >>> b = B()
    >>> type(b)
    <class '__main__.B'>