Wednesday, February 11, 2009

[Python] Python中的类型与对象

读了一篇文章Python Types and Objects探讨Python当中的类型与对象。要说这篇文章也算是写的不错,图文并茂的。可是我还是看的迷迷糊糊的。于是又多花了一些时间搞清Python里的关系。

一切都是对象

先从简单的说起
>>>mylist = [1,2,3]
>>>type(mylist)
<type 'list'>
所以这里我们新建了一个list的实例叫mylist。通过内建的type()函数我们可以查看这个实例的类型,返回的结果告诉我们它的类型是list这种内建的类型。
>>>type(list)
<type 'type'>
>>>list.__bases__
(<type 'object'>,)
这里我们先查看了list的类型。我们得知list的类型是type,换言之list是type的一个实例。紧接着我们用__bases__属性查看它的父类,得知list其实继承了内建的object。再来
>>>type(type)
<type 'type'>
>>>type.__bases__
(<type 'object'>,)
好,现在我们知道type的类型还是type自己,它是自己的一个实例,同时它继承了object。最后:
>>>type(object)
<type 'type'>
>>>type.__bases__
()
从而我们得知,object也是type的一个实例,同时它没有父类。

总结一下目前的结论:
  • Python当中任何东西都是对象,它都要对应一个类型
  • 为了表达这个类型,Python仍然使用了对象。所以int, list这些类型同时也都是对象。比方你可以用id(int),id(list)得到这些类型的id(其实是这些对象的内存地址)
  • 为了得到统一的解释(每个对象都对应一个类型),便赋予int, list对象以一个type类型。type自己也是一个对象
  • type的类型是自己,这个游戏从而可以结束了。
  • object也是一种类型,可以类比于int, list。但是由于每样东西都是对象,所以int, list, type这些抽象的类型落实到instance以后又都是object派生出来的。
class 和 type 的统一

在Python2.2之前,class和type是阳关道和独木桥,互不相干。这种class也被称为老式类(old-style class)。从Python2.2之后开始,class可以被认为是一种用户自定义的类型,也被称为新式类(new-style class)。从地位上来说和list或者dict等类型一样。为兼容起见老式类依然被保留,并认为是一个类默认的类型。如果你要定义一个新式类,该类必须继承object,或者继承一个其他新式类。(注:Python3.0以后将不再支持老式类)

现在让我们作一下实验,分别定义一个老式类 oldclass和一个新式类 newclass:
>>>class oldclass:
...    def __init__(self):
...        pass
>>>class newclass(object):
...    def __init__(self):
...        pass

检验一下:
>>>oldobj = oldclass()
>>>newobj = newclass()
>>>print type(oldobj), oldobj.__class__
<type 'instance'> <class __main__.oldclass at 0x7f700714da10>
>>>print type(newobj), newobj.__class__
<class '__main__.newclass'> <class '__main__.newclass'>

这里我们可以看到新式类的类型和__class__是统一的。再来检验一下内建的dict:
>>>print type(dict), dict.__class__
<type 'type'> <type 'type'>
我们看到同样的结论。

本文参考:
Python Types and Objects
Data Model

No comments: