2011-02-05 70 views
8

如果我定义Python中的类如:Python的默认继承?

class AClass: 
    __slots__ = ['a', 'b', 'c'] 

它继承哪一类?它似乎不会从object继承。

+0

关于`object`和旧vs新类的所有答案都是正确的,但你为什么要问?是否有实际的理由,还是仅仅是一个哲学/语言设计问题? (因为在大多数情况下,没关系!) – 2011-02-05 10:16:17

回答

11

如果您定义了一个类并且不声明任何特定的父类,则该类将成为“经典类”,其行为与“从对象继承的”新类“的行为有点不同。在这里看到更多的细节:http://docs.python.org/release/2.5.2/ref/node33.html

经典类没有共同的根,所以基本上,你的AClass不从任何类继承。

请注意,这是特定于3.0版之前的Python版本。在Python 3中,如果没有声明其他父类,则所有类都是新类,并从对象隐式地继承。

2

在Python 2.x或更旧版本中,您的示例AClass是“旧式”类。

“新风格”类具有已定义的继承,并且必须从对象或其他类继承。

What is the difference between old style and new style classes in Python?

编辑:哇,我不认为这是可以使用在Python 3.x的旧样式语法但我只是试了一下,而且语法仍然有效。但你得到一个新式的课程。

2

让我们试试吧。

>>> class AClass: 
...  pass 
... 
>>> AClass.__bases__, type(AClass) 
((), <type 'classobj'>)    # inherits from nothing 

>>> class AClass(object):    # new style inherits from object 
...  pass 
... 
>>> AClass.__bases__, type(AClass) 
((<type 'object'>,), <type 'type'>) 

阅读其他答案中给出的链接中的新样式类的介绍。

8

试试下面的代码片段在Python 2.7和Python 3.1

class AClass: 
    __slots__ = ['a', 'b', 'c'] 
print(type(AClass)) 
print(issubclass(AClass,object)) 
print(isinstance(AClass,type)) 

在Python 2.7,你会得到:

<type 'classobj'> 
False 
False 

和Python 3.1,你会得到。

<class type> 
True 
True 

这就解释了一切。这是Python 2中的旧式类,除非您从object中继承它。只有在Python3中,默认情况下它将被视为新的样式类。