(老式)类的概念与类型的概念无关:如果x是一个旧式类的实例,则x.__class__指定x的类,但type(x)总是<类型“实例”祝辞> < /代码。< / p >
这反映了一个事实,即所有旧式实例,独立于它们的类是用一个内置类型实现的,称为实例。< / p >
< p > # 0。新风格的类只是一个用户定义的类型,不多不少
如果x是一个new-style类的实例,那么type(x)通常是与x.__class__相同(尽管这不能保证- aNew-style类实例允许重写返回的值# 0)。< / p >
# 0。
它也有一些直接的好处,比如能够大多数内置类型的子类,或者“描述符”的引入,
# 0。
新建样式类通过指定另一个新建样式类来创建(即类型)作为父类,或者“顶级类型”对象(如果没有)需要另一位家长。< / p >
新式类的行为不同于旧式类类中一些重要的细节除了什么类型的回报。< / p >
其中一些更改是新对象模型的基础,例如调用特殊方法的方式。其他的则是“修复”,无法修复出于兼容性考虑,应该像方法一样在之前实现在多重继承情况下的解析顺序
In [3]: class A:...: def __init__(self):...: self.a = 'hi there'...:
In [4]: class B(object):...: def __init__(self):...: self.a = 'hi there'...:
In [6]: aobj = A()In [7]: bobj = B()
In [8]: %timeit aobj.a10000000 loops, best of 3: 78.7 ns per loop
In [10]: %timeit bobj.a10000000 loops, best of 3: 86.9 ns per loop
# OK, old:class Old: passtry:raise Old()except Old:passelse:assert False
# TypeError, new not derived from `Exception`.class New(object): passtry:raise New()except TypeError:passelse:assert False
# OK, derived from `Exception`.class New(Exception): passtry:raise New()except New:passelse:assert False
# `'str'` is a new style object, so you can't raise it:try:raise 'str'except TypeError:passelse:assert False