type() 是动态创建类的唯一标准方式,types 模块仅提供类型标识与 functiontype/methodtype 等绑定工具;动态方法需用 types.methodtype 绑定函数到实例,而非直接使用 types 下其他类型。

types 模块本身不支持动态创建类,它只提供类型对象(如 FunctionType、MethodType)和少量构造工具,真正创建类要用 type();动态创建方法则需配合 types.FunctionType 和绑定逻辑。
用 type() 动态创建类,不是 types.new_class
types.new_class 是高级封装,底层仍调用 type(),但多数场景直接用 type(name, bases, namespace) 更可控、更常见。容易误以为 types 是“造类入口”,其实它是“类型标识工具箱”。
-
name是字符串,必须合法(不能是"123"或"class") -
bases必须是 tuple,哪怕单父类也要写成(object,) -
namespace是 dict,键为属性/方法名,值为函数或数据;其中函数不会自动变成绑定方法,需手动处理self - 若想支持
__init__或继承,得显式写进namespace,例如:MyClass = type('MyClass', (object,), { '__init__': lambda self, x: setattr(self, 'x', x), 'show': lambda self: self.x })
用 types.FunctionType 构造函数对象再绑定到实例
动态生成的函数默认是普通函数,不是方法。要让它像实例方法一样访问 self,得用 types.FunctionType 重建函数对象,并通过 setattr 赋给实例(非类),否则调用时会报 TypeError: missing 1 required positional argument: 'self'。
- 原始函数需接收
self参数(哪怕不用),例如def f(self, y): return y * 2 - 用
types.FunctionType(f.__code__, f.__globals__, 'dynamic_method')可复制函数行为(通常直接复用原函数即可,除非要改名字或环境) - 绑定到实例:
inst = MyClass(42) inst.dynamic_method = types.MethodType(lambda self, y: y * self.x, inst) # 注意:这里用了 types.MethodType,不是 FunctionType
- 若绑定到类,则所有实例共享该方法,但要注意闭包变量捕获问题
为什么不用 types.LambdaType 或 types.BuiltinFunctionType?
types.LambdaType 只是 FunctionType 的别名,没有额外能力;BuiltinFunctionType 对应 C 实现函数(如 len),无法动态构造。真正可安全用于动态构造的是 types.FunctionType 和 types.MethodType,其余基本是类型判断用途。
-
isinstance(f, types.FunctionType)常用于框架中区分普通函数和方法 -
types.MethodType(func, instance)是让函数获得self绑定的唯一标准方式 - 试图用
types.BuiltinFunctionType构造函数会失败:它没有公开构造接口,仅用于运行时识别
动态创建类和方法的关键不在 types 模块本身,而在于理解 Python 对象模型——类本质是可调用对象,方法本质是绑定了 self 的函数。绕开 type() 和 types.MethodType 直接硬套 types 下其他类型,大概率卡在调用签名或属性查找上。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











