动态替换类方法的核心是修改类的__dict__或直接赋值新函数,需区分实例/类/静态方法;替换后影响所有实例,但原引用不自动更新,生产环境需谨慎。

在运行时动态替换类的方法实现,核心思路是修改类的属性字典(__dict__)或直接给类对象赋值新函数,从而覆盖原有方法。Python 的动态性使得这非常自然,但需注意实例方法、类方法、静态方法的区别,以及是否影响已创建的实例。
直接给类赋值新函数(最常用)
Python 中方法本质是类属性,只要把一个可调用对象赋给类的某个名字,就完成了替换:
class Greeter:
def greet(self):
return "Hello"
def new_greet(self):
return "Hi there!"
Greeter.greet = new_greet # 动态替换
g = Greeter()
print(g.greet()) # 输出:Hi there!
✅ 优点:简洁、生效快、影响所有后续和已有实例(因为实例方法查找走的是类字典)。
⚠️ 注意:被替换的是绑定方法(self 仍自动传入),所以新函数必须保留 self 参数。
替换类方法(@classmethod)和静态方法(@staticmethod)
它们也是类属性,但需要保持装饰器语义,否则可能丢失类型信息或导致调用异常:
- 替换
@classmethod:新函数仍需用@classmethod包装 - 替换
@staticmethod:新函数需用@staticmethod包装,或直接赋值后手动设置__func__(不推荐)
class Greeter:
@classmethod
def say(cls):
return f"From {cls.__name__}"
def new_say(cls):
return "New class method"
Greeter.say = classmethod(new_say) # 正确方式
AutoIt3 中文帮助文档打包
AutoIt v3 版本, 这是一个使用类似 BASIC 脚本语言的免费软件, 它设计用于 Windows GUI(图形用户界面)中进行自动化操作. 利用模拟键盘按键, 鼠标移动和窗口/控件的组合来实现自动化任务. 而这是其它语言不可能做到或无可靠方法实现的(比如VBScript和SendKeys). AutoIt 非常小巧, 完全运行在所有windows操作系统上.(thesnow注:现在已经不再支持win 9x,微软连XP都能放弃, 何况一个win 9x支持), 并且不需要任何运行库. AutoIt
下载
print(Greeter.say()) # 输出:New class method
仅替换某个实例的方法(猴子补丁到实例)
如果只想改单个对象的行为,可以给该实例动态设置一个同名的**可调用属性**(注意:不是方法,而是普通属性):
class Greeter:
def greet(self):
return "Hello"
g = Greeter()
绑定一个新函数到实例(需手动绑定 self)
from types import MethodType
g.greet = MethodType(lambda self: "Hey!", g)
print(g.greet()) # 输出:Hey!
⚠️ 注意:这样不会影响其他实例,且 g.greet 已不再是类方法,而是实例上的独立可调用对象。
使用 types.FunctionType 或闭包做更灵活替换
比如想在原方法基础上加日志、缓存等逻辑,可用包装器动态生成新方法:
import typesdef with_log(func): def wrapper(self, *args, *kwargs): print(f"[LOG] Calling {func.name}") return func(self, args, **kwargs) return wrapper
替换类中所有方法(示例:只换 greet)
original_greet = Greeter.greet Greeter.greet = with_log(original_greet)
✅ 这种方式适合 AOP 风格的运行时增强,无需修改原代码。
不复杂但容易忽略:替换后,原方法引用若还被其他变量持有,不会自动更新;同时单元测试或 IDE 可能无法识别这种动态变更,建议谨慎用于生产关键路径。









