为什么如果我这样做:

class C(): pass
type(C())

我有: <type 'instance'>, ,但是如果我这样做:

class C(object): pass
type(c())

我有: <class '__main__.c'> ?

第一个不是很userfull

有帮助吗?

解决方案

查找老式和新样式课程之间的区别。前者是默认值,后者是从对象明确继承的。

所有旧样式的对象均使用内置类型实例实现。它们仍然是默认值并且其类型仍然是“实例”的事实,是复古兼容预防措施的结果。

这是从Python Docs(http://docs.python.org/reference/datamodel.html)中提取的

3.3。新风格和经典课程和实例有两种口味:老式(或经典)和新样式。

到Python 2.1,老式课程是用户唯一可用的风味。 (老式)类的概念与类型的概念无关:如果x是老式类的实例,则是x。班级 指定x的类,但是键入(x)始终是。这反映了以下事实:所有旧式实例(独立于班级)都是用单个内置类型(称为实例)实现的。

在Python 2.2中引入了新样式的课程,以统一类和类型。新样式的类既不比用户定义的类型更少也不少。如果x是新样式类的实例,则类型(x)通常与x>相同。班级 (尽管不能保证这一点 - 允许新样式的类实例覆盖X返回的值。班级).

引入新样式类的主要动机是提供一个完整的元模型的统一对象模型。它还具有许多实际的好处,例如大多数内置类型的能力,或引入“描述符”的能力,这些功能可以实现计算的属性。

出于兼容的原因,默认情况下的课程仍然是古老的。新样式的类是通过指定另一个新样式的类(IE A类型)作为父级或“顶级类型”对象创建的,如果不需要其他父对象。除了哪种类型()返回,新样式类的行为在许多重要细节中与老式类别的行为不同。这些更改中的一些是新对象模型的基础,例如调用特殊方法的方式。其他人是在兼容性问题之前无法实施的“修复”,例如在多个继承时的方法解决顺序。

尽管本手册旨在全面覆盖Python的班级机制,但在某些领域的覆盖范围覆盖新样式的课程时,它可能仍然缺乏。请参见 http://www.python.org/doc/newstyle/有关其他信息的来源。

旧式课程在Python 3.0中被删除,仅留下新样式类的语义。

其他提示

老实说,我认为这里没有一个简短的答案。我建议您开始在此处阅读有关Python的类型统一 /新样式课程:http://www.python.org/doc/newstyle/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top