
核心梗概别的语言比如 Java编译完就定型了像一块砖头。Python 不一样它像一堆乐高积木程序跑着跑着你还能随时给它加个翅膀、装个轮子。1. 实例的“私有小金库”只属于我自己的属性Python 的动态性最直观的体现就是你不需要在__init__里定义就能直接给实例赋新值。class Person: pass p1 Person() p2 Person() # 像贴便利贴一样随意 p1.name 隔壁老王 p2.age 30 print(p1.name) # 隔壁老王 print(p2.age) # 30 # print(p2.name) # 报错因为 name 只贴在了 p1 身上这就像你和同事都开同款出厂汽车类你在自己车里放了个抱枕p1.name你同事车里并没有这个抱枕。这种灵活性让 Python 能轻松应对各种动态传参。2. 给实例动态“安装”方法types.MethodType光加属性不过瘾我们还要给某个特定的实例单独加一个函数让它拥有别人没有的特异功能这里有个巨坑直接p1.func def是不行的因为直接赋值的函数不会自动传self。必须用types.MethodType把这个函数“绑定”到实例上。import types def get_my_name(self): return f我的名字是 {self.name} # 只给 p1 安装这个技能p2 学不会 p1.get_name types.MethodType(get_my_name, p1) print(p1.get_name()) # 我的名字是 隔壁老王生动比喻这就好比你和同事都有一台 iPhone类你的手机越狱了装了个特殊插件p1.get_name你同事的手机没越狱他就用不了这个插件。3. 类级别的“基因改造”影响所有子子孙孙给实例加东西只影响一个人但给类加东西那可就厉害所有的实例都会自动继承这个新特性包括之前已经创建好的老实例# 给类加一个类属性 Person.max_age 100 print(p1.max_age) # 100 p1 是之前创建的但现在也有了 # 给类加一个类方法 classmethod def show_info(cls): return f我是 {cls.__name__}我代表全人类 Person.show_info show_info print(p1.show_info()) # 我是 Person我代表全人类 print(Person.show_info()) # 类本身当然也能调用进阶技巧Monkey Patch猴子补丁。这是动态添加最著名的应用场景。比如你发现第三方库requests有个 Bug不用等官方修复直接在程序启动时把它的方法替换成你自己的# 偷天换日把原来的 get 方法换成我的加强版 import requests original_get requests.get def monkey_patch_get(url, **kwargs): print(f警告正在访问危险链接 {url}) return original_get(url, **kwargs) requests.get monkey_patch_get # 运行时替换 # 从此以后整个项目里所有 requests.get 都会被拦截