类中的对象和实例的区别
这两段代码有什么区别呢:
class ThisIsAClass(object)
pass
print ThisIsAClass()
>> <__main__.ThisIsAClass object at 0x7f0128a8fd10>
和这段呢?
class ThisIsAClass()
pass
print ThisIsAClass()
>> <__main__.ThisIsAClass instance at 0x7f0128a8fd10>
3 个回答
1
第一个是新式类,第二个是旧式类。你可以查看文档来了解它们之间的区别。
1
从 object
继承的类叫做新式类,而不继承的类叫做旧式类。大多数普通用户可能不会注意到这两者有什么不同,但在多重继承和一些很酷的装饰器的使用上,它们之间的差别可大了。比如说,property
这个功能只能在新式类中使用。
现在推荐大家使用新式类,所以我觉得总是从 object
继承是个好习惯,除非你有很好的理由不这样做。另外,如果你将来换到 python3.x,所有的类都会自动变成新式类,所以现在就养成使用新式类的习惯是最好的 :).
5
声明的类型是不同的。新式类是从对象(object)或者其他新式类继承而来的。
class NewStyleClass(object):
pass
class AnotherNewStyleClass(NewStyleClass):
pass
而旧式类则不是这样。
class OldStyleClass():
pass
简单来说,新式类要么继承自 object
,要么继承自其他新式类。
在Python 2.1之前,用户只能使用旧式类。旧式类的概念和类型的概念没有关系:如果x是一个旧式类的实例,那么 x.__class__
表示的是 x
的类,但 type(x)
总是 < type 'instance'>
。这说明所有旧式实例,不管它们的类是什么,都是用一种叫做实例(instance)的内置类型来实现的。
新式类是在Python 2.2中引入的,目的是为了统一类和类型。新式类就是用户定义的一种类型。如果 x
是新式类的实例,那么 type(x)
和 x.__class__
是一样的。
引入新式类的主要原因是为了提供一个统一的对象模型和完整的元模型。
出于兼容性考虑,默认情况下,类仍然是旧式类。
而在Python 3中,只有新式类。