news 2026/8/12 17:53:06

动态添加类成员 —— Python 的“变形金刚”属性

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
动态添加类成员 —— Python 的“变形金刚”属性

核心梗概:别的语言(比如 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 都会被拦截
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/12 17:51:37

Vue3状态管理进阶:从Pinia到Composable的AI对话应用架构优化

1. 项目概述:当Vue3遇见AI对话,状态管理的十字路口最近在折腾一个基于Vue3的AI对话应用,从原型到迭代,一路踩坑。项目本身不复杂,核心就是一个聊天界面,用户输入问题,调用大模型接口&#xff0c…

作者头像 李华
网站建设 2026/8/12 17:50:57

SpringBoot3+Vue3+MySQL 宿舍报修缴费系统源码前后端分离实战

一、项目简介 本系统是一套面向高校或企业宿舍场景的报修与水电缴费一体化管理平台,采用前后端分离架构,后端基于 SpringBoot 3.x 提供 RESTful API,前端基于 Vue 3 构建单页应用。系统内置 JWT 身份认证与 RBAC 权限控制,覆盖学生…

作者头像 李华
网站建设 2026/8/12 17:50:46

零基础玩转bWAPP靶场(四十九):XSS - Reflected (Eval)

摘要:这是 bWAPP 系列第四十九篇,聚焦于 XSS - Reflected (Eval)。这一关非常特殊——注入点不在普通的输出位置,而是在 JavaScript 的 eval() 函数中。eval() 会执行传入的任何 JavaScript 代码,因此攻击者可以在 URL 参数中注入…

作者头像 李华
网站建设 2026/8/12 17:49:57

开发者如何构建技术雷达与学习系统,高效筛选并实践新技术

最近,很多开发者朋友在后台留言,说感觉自己的技术学习进入了“瓶颈期”:每天刷着技术新闻,收藏夹里堆满了各种“最新”、“颠覆性”的框架和工具,但真正动手时却无从下手,或者学完就忘,无法形成…

作者头像 李华
网站建设 2026/8/12 17:49:20

大语言模型函数调用格式漂移:从根源分析到工程实战解决方案

1. 项目概述:当AI的“手”开始不听使唤最近在折腾大语言模型(LLM)应用落地的朋友,估计没少被“Function Calling”(函数调用)这个功能折腾。它本应是连接AI“大脑”与现实世界“手脚”的完美桥梁——让模型…

作者头像 李华