在Python世界深处,有一个能生产类的神秘工厂:
class Meta(type):
def __new__(cls, name, bases, dct):
dct['secret_code'] = 42
return super().__new__(cls, name, bases, dct)
class MagicClass(metaclass=Meta):
pass
print(MagicClass.secret_code) # 输出42
这不是魔术,而是元类的神奇力量。今天我们将揭开类创建的面纱,探索Python最强大的魔法——元编程。
一、类诞生的量子泡沫
普通类创建就像3D打印:
-
读取类定义(蓝图)
-
调用
type
创建类对象 -
实例化对象
元类的工作流程:
class = Meta.__new__() # 量子态生成
Meta.__init__(class) # 初始化属性
class.__prepare__() # 命名空间准备
class.__new__() # 实例创建
class.__init__() # 实例初始化
动态创建类演示:
# 等价于 class Dog: pass
Dog = type('Dog', (), {})
d = Dog()
二、元类:制造类的机器
实现自动注册子类的元类:
class RegistryMeta(type):
_classes = []
def __new__(cls, name, bases, dct):
new_class = super().__new__(cls, name, bases, dct)
if not bases: # 跳过基类
return new_class
cls._classes.append(new_class)
return new_class
class Animal(metaclass=RegistryMeta):
pass
class Cat(Animal): pass
class Dog(Animal): pass
print(RegistryMeta._classes) # [<class '__main__.Cat'>, <class '__main__.Dog'>]
三、描述符:属性的幕后操控者
属性访问背后的秘密通道:
class Temperature:
def __get__(self, instance, owner):
return instance._temp * 9/5 + 32
def __set__(self, instance, value):
instance._temp = (value - 32) * 5/9
class WeatherStation:
temp = Temperature()
ws = WeatherStation()
ws.temp = 77
print(ws.temp) # 77 → 25℃ → 77℉
四、实战魔法手册
自动添加版本信息:
class VersionMeta(type):
def __new__(cls, name, bases, dct):
dct['__version__'] = '1.0.0'
return super().__new__(cls, name, bases, dct)
class API(metaclass=VersionMeta):
pass
print(API.__version__) # 1.0.0
单例模式终极实现:
class SingletonMeta(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super().__call__(*args, **kwargs)
return cls._instances[cls]
class Database(metaclass=SingletonMeta):
pass
d1 = Database()
d2 = Database()
print(d1 is d2) # True