一日一技: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天前
|
存储 Go 索引
牢记python对象的操作方式
【6月更文挑战第20天】在Python中,`hash()`和`is`帮助确定对象的相等性。`dir()`和`vars()`揭示对象的属性和内部表示,`__slots__`优化内存使用。列表和字典结构有不同的内存和性能特性,字典使用哈希表进行快速访问。
36 5
牢记python对象的操作方式
|
3天前
|
Python
python中使用update()方法
【6月更文挑战第16天】
16 7
|
2天前
|
Web App开发 数据采集 JavaScript
python执行js代码几个方法
python执行js代码几个方法
|
6天前
|
Python
Python中的模块对象__package__
【6月更文挑战第13天】
14 5
|
5天前
|
算法 Java 程序员
Python内存管理用引用计数(对象的`ob_refcnt`)跟踪对象,但循环引用(如A->B->A)可导致内存泄漏。
【6月更文挑战第20天】Python内存管理用引用计数(对象的`ob_refcnt`)跟踪对象,但循环引用(如A->B->A)可导致内存泄漏。为解决此问题,Python使用`gc`模块检测并清理循环引用,可通过`gc.collect()`手动回收。此外,Python结合标记清除和分代回收策略,针对不同生命周期的对象优化垃圾回收效率,确保内存有效释放。
13 3
|
6天前
|
存储 Python
Python中的模块对象__dict__
【6月更文挑战第13天】
13 4
|
6天前
|
Python
Python中的模块对象__path__
【6月更文挑战第13天】
8 2
|
6天前
|
Python
Python三种标准输出重定向方法
Python 提供了标准库中的 sys.stdout 对象来代表标准输出。如果我们想将输出重定向到其他位置,例如内存、文件或自定义类,我们可以通过一些技巧来实现。
13 2
|
6天前
|
存储 缓存 调度
Python教程:一文了解10种数据结构在Python中的实现方法
数据结构是计算机科学中非常重要的概念,它用于组织和存储数据,使得数据可以高效地被访问和操作。在编程中,选择合适的数据结构对于解决问题和提高程序性能至关重要。
21 1
|
1天前
|
JavaScript PHP 网络架构
Python学习技巧及方法总结
Python学习技巧及方法总结