【python】元类 (Metaclass) 详解

元类 (Metaclass) 详解

一.什么是元类?

元类是类的类,它定义了类如何被创建和行为。在 Python 中,类本身也是对象,而元类就是创建这些类对象的"模板"。

简单来说:

  • 普通类 → 创建实例对象
  • 元类 → 创建类对象
┌─────────────────────────────────────────────────────────────────┐
│                          元类层面                                │
├─────────────────────────────────────────────────────────────────┤
│  ┌─────────────────┐      创建      ┌─────────────────┐         │
│  │   MyMeta        │ ─────────────► │   MyClass       │         │
│  │ (继承自type)     │                │ (使用MyMeta)    │         │
│  └─────────────────┘                └─────────────────┘         │
│         △                                △                      │
│         │                                │                      │
│  ┌─────────────────┐              ┌─────────────────┐           │
│  │   type          │              │   MyChildClass  │           │
│  │ (内置元类)       │              │ (继承MyClass)    │          │
│  └─────────────────┘              └─────────────────┘           │
└─────────────────────────────────────────────────────────────────┘
                                           │ 实例化
                                           ▼
                                    ┌─────────────────┐
                                    │   obj           │
                                    │ (MyClass实例)   │
                                    └─────────────────┘

二.基本概念

1. 类型层次结构

# 一切皆对象
num = 42
print(type(num))        # <class 'int'> - num 是 int 类的实例
print(type(int))        # <class 'type'> - int 类是 type 类的实例

class MyClass:
    pass

obj = MyClass()
print(type(obj))        # <class '__main__.MyClass'> - obj 是 MyClass 的实例
print(type(MyClass))    # <class 'type'> - MyClass 是 type 类的实例

print(type(type))       # <class 'type'> - type 是它自己的实例

2. 默认元类

在 Python 中,所有类的默认元类都是 type

三.创建元类的方法

方法1:继承 type 类

class MyMeta(type):
    def __new__(cls, name, bases, attrs):
        """在类创建时调用"""
        print(f"创建类: {
     
     name}")
        
        # 可以修改类属性
        attrs['version'] = '1.0'
        
        # 自动添加前缀到方法名
        new_attrs = {
   
   }
        for attr_name, attr_value in attrs.items():
            if callable(attr_value) and not attr_name.startswith('__'):
                new_attrs['meta_' + attr_name] = attr_value
            else:
                new_attrs[attr_name] = attr_value
        
        return super().__new__(cls, name, bases, new_attrs)
    
    def __init__(cls, name, bases, attrs):
        """在类初始化时调用"""
        super().__init__(name, bases, attrs)
        print(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值