搞懂Python世界中的造物主——元类(广州中软卓越)
相信Python是一门强有力的“胶水语言”这个大家都知道,集成了一堆概念在这门语言里面,比如:迭代器,装饰器,函数,生成器,类,对象,协程等等。这些概念对初学者似乎没一个好懂的,不过还有比这更难的概念。虽然我们很少去直接使用它,但天天都在用,它就是今天的主角——元类。
今天广州中软卓越python培训课程就来说说这“Python世界中的造物主”,要搞懂元类,还是先从对象说起。
一、对象(Object):Python一切皆对象。一个数字是对象,一个字符串是对象,一个列表是对象,一个字典是对象,例如:

等号右边是对象,左边是给这些对象取的名字,任何对象都有3个关键属性:标识、值、类型。
1、标识
标识就和人的身份证ID一样,每个对象有唯一ID标识,在整个生命周期中都不会变,可以认为标识是这个对象在计算机内存中的地址。通过函数 id() 可以查看对象的ID标识。

2、对象的第二个属性是值,值很好理解,比如i的值是10,s的值是abc,nums的值就是1,2,3。
3、类型:任何对象都有属于自己的类型,对象就是由它的类型构造出来的,比如上面的i的类型是int类型,这个对象就是由int构造出来的。s类型是字符串类型,nums 的类型是列表类型,dicts 的类型是字典类型,它们都是由对应的类型构建出来的。
通过type()可以查看对象的类型。

对象的类型也和ID标识一样,确定好之后就不会再变化了。
类与(实例)对象
除了系统已经定义好了的整数类型,字符串类型,列表等类型之外,我们还可以创建自己的类型,用关键字class来定义。例如:

这里的Person就是自定义类,类是一个抽象的模版,既不指张三也不是李四,现在我们可以通过调用这个类来构造(实例化)出一个具体的,实在的,有名字的对象出来,这个对象称之为实例对象。

这里的p1、p2 就是实例化之后的(实例)对象,这两个对象的类型都是 Person 类,类与(实例)对象的关系就像一个车辆模具与一辆被造出来的真实车的关系一样。

刚刚我们说了一切都是对象,实例(真实车)是对象,类(模具)当然也是对象,因为它也是个实实在在存在的东西,
当Python解释器执行到关键字 class 这个指令的时候,在内部就会创建一个名为 "Person" 的类,这个类也是个对象,我们称之为类对象(注意区别实例对象),它一样有ID标识、有类型、有值。例如:

我们注意到这个 Person 这个类对象的类型叫 “type”,也就是说 Person 类是由 type 创建出来的,现在你要记住,p1,p2 是实例对象,而 Person 是类对象。另外,这个 type 是什么鬼?
我们来回顾一下,实例对象p1的类型是类对象 Person,Person 的类型 type

nums的类型是 list,list 的类型也是 type,字典类(dict)的类型也是 type,所有类的类型都是 type,也就是说所有的类都是由type 创建的。这个 type 就是元类,道生一,一生二,三生万物,元类就是 Python 中的造物主。(元类自己也是对象)

现在我们都知道类(对象)可以使用class关键字创建,我们还知道类(对象)的类型是 type,既然知道了它的类型是 type,那么肯定可以通过 type(元类)来创建。
用元类创建类
前面讲到过,type有一个作用是用于检查对象的类型,其实它还有另外一个作用就是作为元类动态地创建类(对象)。

Person就是一个类,它等价于:

用元类type创建类的语法是:
type(类名,基类元组(可以为空), 属性字典)
去企业,学习企业需要的编程技能!广州中软卓越python培训,真实企业背景,送你企业入场券!