欢迎光临
我们一直在努力

Python元类详解|什么是元类、type原理、自定义元类、底层类的创建机制(高阶必学)

一、先搞懂:Python 一切皆对象

在 Python 中:所有东西都是对象。

包括:数字、字符串、列表、函数、甚至类本身。

1.1 对象是谁创建的?

普通对象 → 由 类(class) 创建

类(class) → 由 元类(metaclass) 创建

终极层级关系

元类 → 创建类 → 创建对象

对象是类的实例,类是元类的实例。

二、type 到底是什么?(核心真相)

绝大多数人不知道:type 是 Python 的内置元类,是所有类的默认创造者。

type 两种用法

  • type(变量):查看对象类型

  • type(类名, 父类元组, 属性字典):动态创建类

  • 2.1 常规定义类

    class Person:
    pass

    2.2 用 type 动态创建类(底层本质)

    # type(类名, 继承的父类, 名称空间字典)
    Person = type("Person", (), {})

    p = Person()
    print(type(p))
    print(type(Person))

    输出结果

    <class '__main__.Person'>
    <class 'type'>

    结论:所有的类,默认都是 type 的实例对象。

    三、彻底理清:对象、类、元类关系

    class Person:
    pass

    p = Person()

    # 1. 对象的类型是类
    print(type(p)) # Person

    # 2. 类的类型是元类 type
    print(type(Person)) # type

    # 3. type 的类型是自己
    print(type(type)) # type

    终极关系图

    对象 instanceof 类 类 instanceof 元类(type) 元类(type) instanceof 元类(type)

    四、动态给类添加属性和方法

    利用 type 可以在运行期动态组装类,极其灵活。

    def self_intro(self):
    print("我是动态类的方法")

    # 动态创建类并绑定属性、方法
    Student = type("Student", (), {"name":"小明", "intro":self_intro})

    s = Student()
    print(s.name)
    s.intro()

    这就是 Python动态语言的核心特性。

    五、自定义元类(重写类的创建过程)

    默认元类是 type,我们可以继承 type 自定义元类,干预类的创建过程。

    元类核心魔法方法 __new__

    __new__:用来创建类对象,在类产生之前执行。

    自定义元类完整案例

    # 自定义元类,继承type
    class MyMeta(type):
    # 控制类的创建
    def __new__(cls, name, bases, attrs):
    print("正在创建类:", name)
    # 放行,创建类
    return super().__new__(cls, name, bases, attrs)

    # 指定该类使用自定义元类
    class Person(metaclass=MyMeta):
    pass

    运行结果

    正在创建类: Person

    可以看到:类在定义阶段就被元类拦截、管控。

    六、元类实战:强制类必须拥有指定属性

    元类最大用途:代码规范校验、强制子类格式、框架约束

    需求:所有使用该元类的类,必须包含 name 属性,否则报错

    class MyMeta(type):
    def __new__(cls, name, bases, attrs):
    # 校验类是否包含name属性
    if "name" not in attrs:
    raise Exception("自定义错误:类必须包含 name 属性!")
    return super().__new__(cls, name, bases, attrs)

    # 合法
    class Student(metaclass=MyMeta):
    name = "学生"

    # 非法(会报错)
    # class Teacher(metaclass=MyMeta):
    # pass

    这就是 Django ORM、SQLAlchemy、爬虫框架 的底层原理!

    七、元类的执行时机

    普通类 __init__:创建对象时执行

    元类 __new__:定义类的瞬间就执行,无需实例化

    八、元类到底用来干什么?(面试标准答案)

    元类是类的类,用来创建和控制类

    日常开发几乎不用,但是写框架必须用:

  • 强制子类规范(统一属性、统一方法)

  • 自动注册类、自动映射

  • 拦截类创建、修改类属性

  • ORM 数据表字段映射底层实现

  • 名言: 简单项目用面向对象,框架底层用元类。

    九、全文终极总结

  • Python 中 对象由类创建,类由元类创建;

  • 默认元类是 type,type 可以动态创建类;

  • 自定义元类需要 继承 type、重写 __new__;

  • 元类在类定义阶段触发,用于管控类的行为;

  • 用途:框架底层、代码规范、自动注册、ORM映射。

  • 赞(0)
    未经允许不得转载:171主机测评 » Python元类详解|什么是元类、type原理、自定义元类、底层类的创建机制(高阶必学)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址