Python中的类型和类
我对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__'
- 为什么是内在的东西的类型和种类(例如在此列出)相同,但对于用户类/类型的不同?
- 是不是每个类都是某个其他类的实例(如Java中的Class)?为什么没有
__class__
用户定义类?
任何解释/进一步阅读可以澄清这种行为将不胜感激。 TIA。
您遇到新风格类与经典类的不同行为。为进一步阅读阅读: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">
这是告诉你关于对象的实例,而不是它的定义。
看来我的错误是没有使用新的类型结果给了我奇怪的结果(当然是为了向后兼容)。链接看起来很有趣。谢谢。 – sasuke 2010-12-18 19:59:50
这是“恶果的原因”。或者可能的“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'>
很高兴知道。没有意识到Python 3已经解决了所有问题。那么我假设,所有的类不管明确地从'object'派生出来,然后从'object'派生出来? – wheaties 2010-12-18 20:04:55
这是正确的理解。 – 2010-12-18 20:07:22
在Python 3.0,用户定义的类对象是已命名的类型的对象, ,其本身就是一个类的实例。 •在Python 2.6中,新式类继承自object,它是类型的子类; •经典类是类型的实例,不是从类创建的。
你应该用'class A(object)'定义你的类。然后你会得到''。 –
2010-12-18 19:50:33