Python中对象和实例的区别是什么?

21

这发生在Python2.7中。

我正在研究Python中的元类概念,几乎所有教程都将对象作为类的实例来引用。但是,在使用"class A():"这种形式定义类时,我看到了这个:

class ClsDef1():
    pass
C1 = ClsDef1()
print C1
<__main__.ClsDef1 instance at 0x2aea518>

class ClsDef2(object):
    pass
C2 = ClsDef2()
print C2
<__main__.ClsDef2 object at 0x2ae68d0>

这意味着当从一个不继承自object的类创建实例时,该实例是一个instance,但是当一个类从object继承时,该类的实例是一个object?

有人可以解释一下区别吗?在现实生活中我应该使用哪个?

谢谢!


1
这是一个不错的答案。 - ulu5
1
Python 2 还是 Python 3?在后者中,这两个确实是等价的(如果您不命名基类,则可以省略括号)。 - user395760
可能是Python中旧式类和新式类的重复问题的重复问题。 - Martijn Pieters
3个回答

13

这是新式类和旧式类的区别,在文档中有详细解释。基本上,在Python 2.x中,您应该确保始终从object继承,以便获得新式类。在Python 3中,旧式类已完全消失。


4
简短回答:在Python中,所有对象都有一个类型(由type(x)返回),该类型本身也是一个对象。如果“t”是类型对象,则它的类型是特殊类型“type”。因此(type(type(x)) is type)始终为True。在旧类中,用户定义的“class”是“classobj”类型的对象 - 任何类的每个实例都是“instance”类型的对象。即存在两种内置类型“classobj”和“instance”,它们实现了类。从实例到其类的链接通过其__class__成员完成。
使用新类:用户定义的类实际上是新的类型对象(它们的类型是'type'而不是'classobj'),当您创建它们的实例时,每个实例的type()是类对象。因此,不同用户定义的类的对象现在具有不同的类型。而且类基本上与所有内置类型一样重要;对于旧类,实例->class和对象->type有一个单独的结构,而新类则将object->type用于两者。文档中还有更多内容,但这就是核心。

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接