python中对象、类型和元类之间的关系

时间:2021-07-26 18:33:59

在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创建的?

其实创建它们的是一个叫虚拟机的家伙。它是来自另一个世界的。。