我对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__'
__class__
?任何可以澄清这种行为的解释/进一步阅读都将非常感激。 TIA。
答案 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,它是类型的子类; •经典类是类型的实例,不是从类创建的。