一篇文章告诉你什么是 Python 元类

龟叔发明了 Python,而后集成了一堆概念在这门语言里面,好比:迭代器,装饰器,函数,生成器,类,对象,协程等等。python

这些概念对初学者彷佛没一个好懂的,不过还有比这更难的概念,它是 Python 世界中的造物主,虽然咱们不多去直接使用它,但每天都在用,它就是今天的主角------元类。bash

今天个人任务就是完全明白什么是元类,看懂了别忘了给我点个赞,分享给更多人。函数

要搞懂元类,咱们仍是先从对象提及。ui

对象(Object)

Python 一切皆对象,这句话你必定有据说过(如今你就据说了),一个数字是对象,一个字符串是对象,一个列表是对象,一个字典是对象,例如:spa

>>> i = 10
>>> s = "abc"
>>> nums = [1,2,3]
>>> dicts = {"name":"zhang"}
复制代码

等号右边是对象,左边是给这些对象取的名字,任何对象都有3个关键属性:标识、值、类型。.net

标识

标识就和人的身份证ID同样,每一个对象有惟一ID标识,在整个生命周期中都不会变,你能够认为标识是这个对象在计算机内存中的地址。经过函数 id() 能够查看对象的ID标识。code

>>> id(i)
40592592
>>> id(s)
44980584
复制代码

对象值

对象的第二个属性是值,值很好理解,好比 i 的值是 10,s 的值是 abc,nums 的值就是 1,2,3。cdn

类型

对象还有一个很重要的属性就是类型,任何对象都有属于本身的类型,对象就是由它的类型构造出来的,好比上面的 i 的类型是 int 类型,这个对象就是由 int 构造出来的。s 类型是字符串类型,nums 的类型是列表类型,dicts 的类型是字典类型,它们都是由对应的类型构建出来的。协程

经过 type() 能够查看对象的类型。对象

>>> type(i)
<class 'int'>
>>> type(s)
<class 'str'>
>>> type(nums)
<class 'list'>
>>> type(dicts)
<class 'dict'>
复制代码

对象的类型也和ID标识同样,肯定好以后就不会再变化了。

类与(实例)对象

除了系统已经定义好了的整数类型,字符串类型,列表等类型以外,咱们还能够建立本身的类型,用关键字 class 来定义。例如:

>>> class Person:
		# 这里的 self 指某个实例对象本身
...     def __init__(self, name):
			# name 是实例的属性
...         self.name = name
		# live 是类的属性
		live = True
复制代码

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

>>> p1 = Person("zhangsan")
>>> p1.name
'zhangsan'
>>>
>>> p2 = Person("lisi")
>>> p2.name
'lisi'
复制代码

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

>>> p1
<__main__.Person object at 0x0195AA30>
>>> type(p1)
<class '__main__.Person'> # 这里的__main__是模块名称
复制代码

类也是对象(又叫类对象)

刚刚咱们说了一切都是对象,实例(真实车)是对象,类(模具)固然也是对象,由于它也是个实实在在存在的东西,

当 Python 解释器执行到关键字 class 这个指令的时候,在内部就会建立一个名为 "Person" 的类,这个类也是个对象,咱们称之为类对象(注意区别实例对象),它同样有ID标识、有类型、有值。例如:

>>> id(Person)
26564024
>>> type(Person)
<class 'type'>
>>> Person
<class '__main__.Person'>
复制代码

咱们注意到这个 Person 这个类对象的类型叫 “type”,也就是说 Person 类是由 type 建立出来的,如今你要记住,p1,p2 是实例对象,而 Person 是类对象。另外,这个 type 是什么鬼?

咱们来回顾一下,实例对象 p1 的类型是类对象 Person,Person 的类型 type

>>> nums = [1,2,3]
>>> type(nums)
<class 'list'>
>>> type(list)
<class 'type'>
复制代码

nums 的类型是 list,list 的类型也是 type,字典类(dict)的类型也是 type,全部类的类型都是 type,也就是说全部的类都是由type 建立的。这个 type 就是元类,道生一,一辈子二,三生万物,元类就是 Python 中的造物主。(元类本身也是对象)

如今咱们都知道类(对象)能够使用 class 关键字建立,咱们还知道类(对象)的类型是 type,既然知道了它的类型是 type,那么确定能够经过 type(元类)来建立。

用元类建立类

前面讲到过,type 有一个做用是用于检查对象的类型,其实它还有另一个做用就是做为元类动态地建立类(对象)。

>>> Person = type("Person", (), {"live":True})
>>> Person
<class '__main__.Person'>
复制代码

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

>>> class Person:
...     live = True
...
>>> Person
<class '__main__.Person'>
复制代码

用元类 type 建立类的语法是:

type(类名,基类元组(能够为空), 属性字典)
复制代码

那么元类到底有什么用处呢?咱们真的须要元类吗?请关注下回讲解,(留给你们多些时间消化,O(∩_∩)O)

博客: foofish.net
公众号:Python之禅

Python之禅
相关文章
相关标签/搜索