我正在导入其他人制作的库,并且想要更改该库中特定类方法的工作方式,因此我已将该类方法复制到我自己的文件中,并希望在运行时替换它。这对于函数来说似乎工作得很好,但对于类方法来说似乎就不行了。
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)
但每次方法都没有碰过。就像我的代码不存在并且使用旧代码一样。