Python
  • 为什么学Python?
  • Python代码规范
    • 简明概述
    • 注释
    • 命名规范
  • 第一个Python程序
    • Python 简介
    • Python 的安装
    • 第一个 Python 程序
    • 集成开发环境(IDE): PyCharm
  • 基本数据类型和变量
    • Python 语法的简要说明
    • print() 函数
    • Python 的基本数据类型
    • 字符串的编码问题
    • 基本数据类型转换
    • Python 中的变量
  • List 和 Tuple
    • List(列表)
    • tuple(元组)
  • Dict 和 Set
    • 字典(Dictionary)
    • set
  • 条件语句和循环语句
    • 条件语句
    • 循环语句
    • 条件语句和循环语句综合实例
  • 函数
    • Python 自定义函数的基本步骤
    • 函数返回值
    • 函数的参数
    • 函数传值问题
    • 匿名函数
  • 迭代器和生成器
    • 迭代
    • Python 迭代器
    • lsit 生成式(列表生成式)
    • 生成器
    • 迭代器和生成器综合例子
  • 面向对象
    • 面向对象的概念
    • 类的定义和调用
    • 类方法
    • 修改和增加类属性
    • 类和对象
    • 初始化函数
    • 类的继承
    • 类的多态
    • 类的访问控制
  • 模块与包
    • Python 模块简介
    • 模块的使用
    • 主模块和非主模块
    • 包
    • 作用域
  • Python 的 Magic Method
    • Python 的 Magic Method
    • 构造(__new__)和初始化(__init__)
    • 属性的访问控制
    • 对象的描述器
    • 自定义容器(Container)
    • 运算符相关的魔术方法
  • 枚举类
    • 枚举类的使用
    • Enum 的源码
    • 自定义类型的枚举
    • 枚举的比较
  • 元类
    • Python 中类也是对象
    • 使用 type() 动态创建类
    • 什么是元类
    • 自定义元类
    • 使用元类
  • 线程与进程
    • 线程与进程
    • 多线程编程
    • 进程
  • 一步一步了解正则表达式
    • 初识 Python 正则表达式
    • 字符集
    • 数量词
    • 边界匹配符和组
    • re.sub
    • re.match 和 re.search
  • 闭包
  • 装饰器
  • 知识点补漏
    • Python 关键字 yield
  • Python 进阶部分
  • 使用Python虚拟环境
  • Mac中使用virtualenv和virtualenvwrapper
  • Django
Powered by GitBook
On this page
  1. 元类

什么是元类

通过上面的介绍,终于模模糊糊的带到元类这里来了。可是我们到现在还不知道元类是什么鬼东西。

我们创建类的时候,大多数是为了创建类的实例对象。

那么元类呢?

元类就是用来创建类的。也可以换个理解方式就是:元类就是类的类。

通过上面 type() 函数的介绍,我们知道可以通过 type() 函数创建类:

MyClass = type('MyClass', (), {})

实际上 type() 函数是一个元类。

type() 就是 Python 在背后用来创建所有类的元类。

那么现在我们也可以猜到一下为什么 type() 函数是 type 而不是 Type呢?

这可能是为了和 str 保持一致性,str 是用来创建字符串对象的类,而 int 是用来创建整数对象的类。

type 就是创建类对象的类。

你可以通过检查 __class__ 属性来看到这一点。

Python 中所有的东西,注意喔,这里是说所有的东西,他们都是对象。

这包括整数、字符串、函数以及类。它们全部都是对象,而且它们都是从一个类创建而来。

# 整形
age = 23
print(age.__class__)
# 字符串
name = '两点水'
print(name.__class__)


# 函数
def fu():
    pass


print(fu.__class__)


# 实例
class eat(object):
    pass


mEat = eat()

print(mEat.__class__)

输出的结果如下:

<class 'int'>
<class 'str'>
<class 'function'>
<class '__main__.eat'>

可以看到,上面的所有东西,也就是所有对象都是通过类来创建的,那么我们可能会好奇,__class__ 的 __class__ 会是什么呢?

换个说法就是,创建这些类的类是什么呢?

我们可以继续在上面的代码基础上新增下面的代码:

print(age.__class__.__class__)
print(name.__class__.__class__)
print(fu.__class__.__class__)
print(mEat.__class__.__class__)

输出的结果如下:

<class 'type'>
<class 'type'>
<class 'type'>
<class 'type'>

认真观察,再理清一下,上面输出的结果是我们把整形 age ,字符创 name ,函数 fu 和对象实例 mEat 里 __class__ 的 __class__ 打印出来的结果。

也可以说是他们类的类打印结果。发现打印出来的 class 都是 type 。

一开始也提到了,元类就是类的类。

也就是元类就是负责创建类的一种东西。

你也可以理解为,元类就是负责生成类的。

而 type 就是内建的元类。也就是 Python 自带的元类。

Previous使用 type() 动态创建类Next自定义元类

Last updated 1 month ago