为什么如果我这样做:
class C(): pass
type(C())
我得到了:<type 'instance'>
,但如果我这样做:
class C(object): pass
type(c())
我得到:<class '__main__.c'>
?
第一个不是很有用
为什么如果我这样做:
class C(): pass
type(C())
我得到了:<type 'instance'>
,但如果我这样做:
class C(object): pass
type(c())
我得到:<class '__main__.c'>
?
第一个不是很有用
查找旧式和新式课程之间的区别。前者是默认的,后者是从对象显式继承的。
所有旧式对象都是使用内置类型实例实现的。它们仍然是默认值并且它们的类型仍然是“实例”这一事实是追溯兼容性预防措施的结果。
这是从 Python 文档 (http://docs.python.org/reference/datamodel.html) 中提取的
3.3. 新式和经典类 类和实例有两种风格:旧式(或经典)和新式。
直到 Python 2.1,旧式类是用户唯一可用的风格。(旧式)类的概念与类型的概念无关:如果 x 是旧式类的实例,则 x. class指定 x 的类,但 type(x) 始终为 。这反映了一个事实,即所有老式实例,独立于它们的类,都是用一个称为实例的内置类型实现的。
Python 2.2 中引入了新型类来统一类和类型。新式类既不多也不少于用户定义的类型。如果 x 是新样式类的实例,则 type(x) 通常与 x> 相同。class (尽管不能保证 - 允许新样式的类实例覆盖为 x.class 返回的值)。
引入新型类的主要动机是提供具有完整元模型的统一对象模型。它还具有许多实际好处,例如能够对大多数内置类型进行子类化,或者引入启用计算属性的“描述符”。
出于兼容性原因,默认情况下类仍然是旧式的。新样式类是通过指定另一个新样式类(即类型)作为父类来创建的,或者如果不需要其他父类,则指定“顶级类型”对象。除了 type() 返回的内容之外,新式类的行为在许多重要细节上与旧式类的行为不同。其中一些更改是新对象模型的基础,例如调用特殊方法的方式。其他是出于兼容性问题而无法实现的“修复”,例如多重继承情况下的方法解析顺序。
虽然本手册旨在全面介绍 Python 的类机制,但在涉及新型类的覆盖范围时,仍可能在某些领域有所欠缺。 有关其他信息的来源,请参见 http://www.python.org/doc/newstyle/ 。
Python 3.0 中删除了旧式类,只留下新式类的语义。新式类。