在python中对象、类型和元类构成了一个微妙的世界。
他们有在这个世界里和平共处,相辅相成。它们遵循着几条亘古不变的定律:
1、python中无处不对象
2、所有对象都有三种特性:id、类型、值
3、每个对象都是由其对应的类创建出来的
下面来逐条进行分析:
1、python中无处不对象
对象是python中对数据的一种抽象的表示。所有能够通过PyObject类型的指针访问的都是对象。
python中的int、tuple、list、dict、set、函数、类以及派生类都是对象,当然类实例化的对象就更应该是对象了吧(这个都不知道的好,语文老师会气死的……………………)。
2、所有对象都有三种特性:id、类型、值
id 其实就是对象在内存中存放的地址。也就是说在内存中开辟了一块空间,用来存放对象的。id其实就相当于你在内存中的身份标识。用内置函数id()可以查询对象的id。
id('a') 2330255367896
类型是生成对象的模型,相当于对象的父母。可以用type()来查看
>>> type('a')
<class 'str'>
值就是对象中存放的数据。值也是对象的价值所在。所有对象存在的意义就是为了保存各种各样的值。有的对象不会改变,叫不可变对象,例如:数值、字符串、元组。对象的值可以改变的对象叫可变对象,例如:列表,集合,字典。
3、每个对象都是由其对应的类创建出来的
遵循第一条定律,其实模型也是对象,它是由它的父母产生的,它的父母是谁呢?查看方法是一样的。
>>> class A(object):
pass
>>> a= A()
>>> type(a)
<class '__main__.A'>
>>> type(A)
<class 'type'>
>>> A.__bases__
(<class 'object'>,)
这里涉及了一个区别:
在py2.X中,新式类需要继承object类,而在py3.x中已经做了更改,在创建所有的类的时候都会默认继承object类。
#py2.79 >>> class A: ... pass ... >>> A.__bases__ () >>> class B(object): ... pass ... >>> B.__bases__ (<type 'object'>,) >>>
#py3.6 >>> class A: pass >>> A.__bases__ (<class 'object'>,)
这里又出现了两个问题:
1,object类是什么?
2,继承是什么?
我们先说第二个问题:
类可以继承和派生,被继承的类叫超类,父类或者基类(管它怎么叫呢,我们只有知道,它是继承它的类的父母就可以了。。。),继承者叫子类或者派生类(叫什么无所谓,反正它是它父母的孩子,本质是不会改变的。。。PS:这里我说句题外话,某些人经常不认自己的父母或孩子,可是你们永远改变不了你们的血缘关系。)。还可以实现多继承,多继承就是一个子类继承多个父类(现在的社会很多孩子的父亲是不确定的,但是类关系确实明确的。。呵呵....又扯远了,我对这个社会是有多么深的怨念啊。)下面还是用实例说话吧。
>>> class A: pass >>> class B: pass >>> class C(A): pass >>> class D(A,B): pass
在这段代码中,C类继承A类,在这个关系中,A就是父类,C就是A的子类。D类同时继承了A类和B类,A类和B类是父类,D同时继承了A和B,所以即时A的子类又是B的子类。
当然继承的知识还有很多,自己可以查一下相关的资料。
再来说说第一个问题:
object类是所有的类的祖宗。这个object其实也是一个对象(python中处处皆对象)。但是这个对象又有一些特别,其他的对象都是一个抽象的对象,而这个object却是一个具体存在的。其他的类或者对象都是通过继承的关系,直接或者间接的继承了object。翻阅所有对象的族谱,最后一定会发现它们的老祖宗就是object。
对象和类型都说完了,剩下的就是说一说元类了。
首先,什么是元类呢?
list,str,int 这些类型是由谁创建的呢。对了,就是元类。元类创建的类不是一般定义的类,它创建的是模版。最根溯源,我们会找到一个特殊的元类,就是type。但是问题又来了我,我们查看type的类型的时候,发现type是由它自身创建的。
>>> type(list) <class 'type'> >>> type(type) <class 'type'> >>>
难道它既是父亲,又是儿子?why?好吧,我们换种查询方式。
>>> type.__bases__
(<class 'object'>,)
其实type是以object为模版创建的。
是不是解释通了呢?别着急,如果你足够细心,你还会发现一个小问题。
>>> type(object) <class 'type'> >>>
what? object是由type创建的?
其实创建它们的是一个叫虚拟机的家伙。它是来自另一个世界的。。