类中对象和实例的区别

3
这是什么不同之处:

And this:

和这个呢:
class ThisIsAClass(object)
    pass

print ThisIsAClass()
>> <__main__.ThisIsAClass object at 0x7f0128a8fd10>

还有这个怎么办?

class ThisIsAClass()
    pass

print ThisIsAClass()
>> <__main__.ThisIsAClass instance at 0x7f0128a8fd10>

请查看今天早些时候的这个问题 - mgilson
3个回答

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仅具有新式类。

很好的回答(+1)。我喜欢你描述为什么一个告诉你它是一个实例,而另一个告诉你它是一个对象的方式(这是我以前不知道的)。 - mgilson
@mgilson,嗯,这是来自文档的直接引用(虽然没有链接)。 - wRAR
非常清晰,谢谢 :) - user1524855
@wRAR -- 是的,我不敢说我已经完全阅读(或理解)了文档;-)。 - mgilson

1
继承自object的类使用new-style类,而另一个使用旧式类。许多日常用户不会注意到差异,但在多重继承和可使用的花哨装饰器方面存在重大差异。例如,property只能用于新式类。
现在建议您使用新式类,因此我发现始终继承自对象是一个好习惯,除非您真的有一个很好的理由要避免它。还要注意,如果您切换到python3.x,所有类将自动变为新样式,因此最好现在就开始适应它们 :)。

1
第一个是新式类,第二个是旧式类。请参阅文档以了解它们的区别。

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