小编Jun*_*une的帖子

Monkey 从库中修补 Python 类方法

我正在导入其他人制作的库,并且想要更改该库中特定类方法的工作方式,因此我已将该类方法复制到我自己的文件中,并希望在运行时替换它。这对于函数来说似乎工作得很好,但对于类方法来说似乎就不行了。

a.library.package.library_file.py

class LibraryClass(ParentClass):
    @classmethod
    def get_cost(cls, time):
        return int(time * cls.hourly)
Run Code Online (Sandbox Code Playgroud)

我想用这个替换它

class LibraryClass(ParentClass):
    @classmethod
    def get_cost(cls, time):
        return 1234
Run Code Online (Sandbox Code Playgroud)

我尝试只进行正常的替换,这对于常规功能来说效果很好

import a.library.package.library_file

...

a.library.package.library_file.LibraryClass.get_cost = get_cost
Run Code Online (Sandbox Code Playgroud)

但它似乎根本无法正常工作,该方法在错误的时间使用错误的参数调用并导致崩溃。在对 Google、StackOverflow 和 Python 进行一些研究之后,我开始尝试使用模拟类。

from unittest.mock import patch

@patch.object('a.library.package.library_file.LibraryClass', 'get_cost')
def get_cost(cls, time):
    return 1234
Run Code Online (Sandbox Code Playgroud)

好消息是它不会崩溃,坏消息是它没有做任何事情,旧代码仍然存在,就像我的代码不存在一样。

我尝试过各种其他方法来做到这一点,例如

import a.library.package.library_file

@patch.object(a.library.package.library_file.LibraryClass, 'get_cost')
...
Run Code Online (Sandbox Code Playgroud)

或者

from a.library.package.library_file import LibraryClass

@patch.object(LibraryClass, 'get_cost')
...
Run Code Online (Sandbox Code Playgroud)

但每次方法都没有碰过。就像我的代码不存在并且使用旧代码一样。

python monkeypatching

5
推荐指数
2
解决办法
5031
查看次数

标签 统计

monkeypatching ×1

python ×1