21

这发生在python2.7

我正在研究python中元类的想法,几乎所有的教程都将对象称为类的实例,在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>

这意味着当从不是对象固有的类创建实例时,该实例是一个实例,但是当一个类是对象固有的时,该类的实例是一个对象?

谁能解释其中的区别?在现实生活中我应该使用哪一个?

谢谢!

4

3 回答 3

13

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

于 2012-05-25T17:59:42.010 回答
4

简短回答:在 python 中,所有对象都有一个类型(由 type(x) 返回),它也是一个对象。
如果't'是一个类型对象,那么它的类型就是特殊类型'type'。所以 (type(type(x)) is type) 总是 True。在旧类中,用户定义的“类”是“类obj”类型的对象——任何类的每个实例都是“实例”类型的对象。即有两种实现类的内置类型“classobj”和“instance”。从一个实例到它的类的链接是通过它的__class__成员。

使用新类:用户定义的类实际上是新类型对象(它们的类型是“type”,而不是“classobj”),当您创建它们的实例时,每个实例的 type() 就是类对象。因此,不同用户定义类的对象现在具有不同的类型。并且类与所有内置类型基本相同;对于旧类,instance->class 和 object->type 有一个单独的结构,新类对两者都使用 object->type。

文档中还有更多内容,但这是它的核心。

于 2012-05-25T18:23:33.140 回答
2

与“类”和“类型”之间的歧义不同,“实例”是“对象”的同义词。这样想:对象是类型的实例。因此,“42 是 int 类型的实例”等价于“42 是 int 对象”。我通常交替使用“实例”和“对象”。报价来源:https ://eli.thegreenplace.net/2012/03/30/python-objects-types-classes-and-instances-a-glossary

于 2017-07-15T05:44:26.040 回答