一日一技:Python如何动态替换对象的方法?

简介: 一日一技:Python如何动态替换对象的方法?

今天有同学在公众号粉丝群问了这样一个问题:

他的问题,简单来说,就是想动态替换一个对象的实例方法,简化代码如下:

class Test:
    def __init__(self, name):
        self.name = name
    def work(self, job):
        print(f'{self.name}正在{job}')
def work(self, job1, job2):
    print(f'{self.name}正在同时做两个工作,分别是{job1}和{job2}')
t = Test('kingname')
t.work = work

当我们在替换之前,直接运行t.work('job'),效果如下:

这个同学期望在替换以后,运行t.work('job1', 'job2'),能够输出:kingname正在同时做两个工作,分别是job1和job2。但上面的代码,直接运行以后会报错,如下图所示:

这说明,替换以后,在调用t.work的时候,Python 不会自动把self传入到第一个参数。

在以前的文章里面,我们已经讲过,实例方法的第一个参数self,就是这个实例对象自身。我们可以写一段代码来验证这一点:

class Test:
    def __init__(self, name):
        self.name = name
    def work(self, job):
        print(f'{self.name}正在{job}')
    def check(self, instance):
        print(f'self的内存地址是:{id(self)}')
        print(f'instance 的内存地址是:{id(instance)}')
        print('self与 instance 就是同一个对象:', self is instance)
t = Test('kingname')
t.check(t)

运行效果如下图所示:

知道这一点以后,要解决动态替换以后报错的问题,最简单的方法就是手动把实例对象作为第一个参数传入进去,如下图所示:

但这样做显然很麻烦,每次都要手动传入第一个实例对象。有没有什么办法能省略它呢?这个时候,如果你记得我公众号里面的这篇文章偏函数:在Python中设定默认参数的另一种办法,那么你就有办法了。使用偏函数,提前把第一个参数固定下来,就能解决问题:

from functools import partial
def work(self, job1, job2):
    print(f'{self.name}正在同时做两个工作,分别是{job1}和{job2}')
simple_work = partial(work, t)
t.work = simple_work

运行效果如下图所示:

目录
相关文章
|
6天前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
65 1
|
30天前
|
机器学习/深度学习 数据采集 数据挖掘
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
|
1月前
|
调度 Python
微电网两阶段鲁棒优化经济调度方法(Python代码实现)
微电网两阶段鲁棒优化经济调度方法(Python代码实现)
|
1月前
|
传感器 大数据 API
Python数字限制在指定范围内:方法与实践
在Python编程中,限制数字范围是常见需求,如游戏属性控制、金融计算和数据过滤等场景。本文介绍了五种主流方法:基础条件判断、数学运算、装饰器模式、类封装及NumPy数组处理,分别适用于不同复杂度和性能要求的场景。每种方法均有示例代码和适用情况说明,帮助开发者根据实际需求选择最优方案。
74 0
|
1月前
|
Python
Python字符串center()方法详解 - 实现字符串居中对齐的完整指南
Python的`center()`方法用于将字符串居中,并通过指定宽度和填充字符美化输出格式,常用于文本对齐、标题及表格设计。
|
9天前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
47 4
|
11天前
|
算法 调度 决策智能
【两阶段鲁棒优化】利用列-约束生成方法求解两阶段鲁棒优化问题(Python代码实现)
【两阶段鲁棒优化】利用列-约束生成方法求解两阶段鲁棒优化问题(Python代码实现)
|
1月前
|
机器学习/深度学习 数据采集 算法
【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Python&matlab代码实现)
【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Python&matlab代码实现)
119 4
|
1月前
|
安全 JavaScript Java
Python中None与NoneType的真相:从单例对象到类型系统的深度解析
本文通过10个真实场景,深入解析Python中表示“空值”的None与NoneType。从单例模式、函数返回值,到类型注解、性能优化,全面揭示None在语言设计与实际编程中的核心作用,帮助开发者正确高效地处理“无值”状态,写出更健壮、清晰的Python代码。
163 3
|
30天前
|
机器学习/深度学习 数据采集 TensorFlow
基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)

推荐镜像

更多