一切都是对象
先从简单的说起
>>>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派生出来的。
在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:
Post a Comment