2010-12-18 92 views
14

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

>>> 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__用户定义类?

任何解释/进一步阅读可以澄清这种行为将不胜感激。 TIA。

+4

你应该用'class A(object)'定义你的类。然后你会得到''。 – 2010-12-18 19:50:33

回答

13

您遇到新风格类与经典类的不同行为。为进一步阅读阅读: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"> 

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

+0

看来我的错误是没有使用新的类型结果给了我奇怪的结果(当然是为了向后兼容)。链接看起来很有趣。谢谢。 – sasuke 2010-12-18 19:59:50

4

这是“恶果的原因”。或者可能的“Histerical”。这一切都固定在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'> 
+0

很高兴知道。没有意识到Python 3已经解决了所有问题。那么我假设,所有的类不管明确地从'object'派生出来,然后从'object'派生出来? – wheaties 2010-12-18 20:04:55

+0

这是正确的理解。 – 2010-12-18 20:07:22

1

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