Python中的类型和类

时间:2010-12-18 19:46:01

标签: python class types

我对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__'
  1. 为什么内置事物的类型和类(例如此处列出)对于用户类/类型是相同但不同的?
  2. 是不是每个类都是其他类的实例(比如Java中的Class)?为什么用户定义的类没有__class__
  3. 任何可以澄清这种行为的解释/进一步阅读都将非常感激。 TIA。

3 个答案:

答案 0 :(得分:14)

您遇到了新样式类与经典类的不同行为。如需进一步阅读,请阅读:Python Data Model。具体阅读有关类的部分以及新样式和经典类之间的区别。

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

class A: pass
class B(object): pass

你会看到你得到不同的结果。在这里,您将处理新样式和旧样式类之间的区别。使用Python 2.6.1就是我得到的:

> type(A)
<type "classobj">
> type(B)
<type "type">

告诉您列表是新样式类而不是旧样式类。我们还可以使用list进一步解决问题:

> type(list)
<type "type">

与我们的class B(object): pass结果相同。而且

> c = []
> type(c)
<type "list">

告诉你关于对象的实例而不是它的定义。

答案 1 :(得分:4)

这是“历史原因”。对于可能的“歇斯底里”。这一切都在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'>

答案 2 :(得分:2)

在Python 3.0中,用户定义的类对象是名为type的对象的实例, 这本身就是一个阶级。 •在Python 2.6中,新式类继承自object,它是类型的子类; •经典类是类型的实例,不是从类创建的。