为什么从对象继承会在Python中产生影响?

时间:2013-08-20 22:14:56

标签: python object inheritance

当从无任何东西继承类时,我有一个实例类型的对象。

>>> class A(): pass;
>>> a = A()
>>> type(a)
<type 'instance'>
>>> type(a) is A
False
>>> type(A)
<type 'classobj'>

但是,当我从对象继承相同的类时,创建的对象是A的类型。

>>> class A(object): pass;
>>> a = A()
>>> type(a)
<class '__main__.A'>
>>> type(a) is A
True
>>> type(A)
<type 'type'>

这背后的逻辑是什么?这是否意味着每个类都应该从对象继承?

3 个答案:

答案 0 :(得分:7)

在Python 3中,这两个是相同的。但是在Python 2中:

class A: pass  # old-style class

class B(object): pass  # new-style class

来自文档中的New-style and classic classes

  

在Python 2.1之前,旧式类是用户可用的唯一风格。 (旧式)类的概念与类型的概念无关:如果x是旧式类的实例,则x.__class__指定类{{1} },但x始终是type(x) 。这反映了这样一个事实,即所有旧式实例独立于其类,都使用一个称为实例的内置类型实现。

     

在Python 2.2中引入了新式类来统一类和类型。新式类既不是用户定义的类型,也不是用户定义的类型。 如果<type 'instance'>是新式课程的实例,则xtype(x)相同。

     

引入新式类的主要动机是提供具有完整元模型的统一对象模型。它还具有许多直接的好处,例如能够对大多数内置类型进行子类化,或引入“描述符”,从而启用计算属性。

出于这些原因,尽可能使用新式课程是个好主意。旧式类甚至存在于Python 2.2+中的唯一原因是为了向后兼容;在Python 3中,删除了旧式类。

答案 1 :(得分:1)

Python中用户定义类的原始实现很糟糕。 2.2修复它,但他们必须保留旧系统以实现向后兼容。因此,Python有两种类型,“经典”和“新风格”。从object(直接或间接)继承的任何东西都是新式的;任何不经典的东西。你编写的每个类都应该以某种方式从对象继承,如果它没有任何其他父类,则直接继承,或间接因为它继承自另一个新式类(或内置类型)。

请参阅http://python-history.blogspot.com/2010/06/new-style-classes.html

答案 2 :(得分:0)

这解释了instance的事情:

>>> class A(): pass;
>>> A
<class __main__.A at 0x7f879998b050>
>>> A()                                            
<__main__.A instance at 0x7f87999a83b0>

但你不应该使用type()来比较python中的对象,你应该使用isinstance()