【问题标题】:Python: override a third party module method?Python:覆盖第三方模块方法?
【发布时间】:2013-12-28 09:11:07
【问题描述】:

所以我使用的是我安装的第三方 python 模块。

我是这样发起的:

from module import SomeClass

sc = SomeClass()
sc.process(text);

process() 正在使用同一模块中另一个类的另一个方法,称为get_Text()

我想修改get_Text()方法返回修改后的字符串。

所以sc.process(text) 会返回与以前不同的结果。

我是否使用猴子补丁?它在这里如何工作?我是否复制粘贴get_text() 方法并在运行时对其进行修改和修补?

【问题讨论】:

标签: python


【解决方案1】:

显式优于隐式。在可能的情况下,只使用继承来改变get_text的结果

class SomeOtherClass(SomeClass):
    def get_text(self):
        return someClass.get_text(self) + ' bar'

【讨论】:

  • 我原则上同意,但听起来get_text() 是从另一个类中调用的——在这种情况下,覆盖process() 本身可能是有利的,甚至是必要的。
  • @AndrewGorcester 是正确的。 get_text()AnotherClass 中。 AnotherClass 在初始化时由 SomeClass 加载。我需要导入AnotherClass 然后覆盖get_text 吗?我想避免覆盖整个 process() 的原因是因为它很长并且使用了其他几个模块和包,我不想复制粘贴整个内容来更改一些内容。
  • @javastudent process() 正在实例化另一个类。除非您更改 process() 或对模块进行猴子补丁,否则 process() 将始终实例化您不想要的 AnotherClass,而不是您创建的一些新变体。我同意覆盖 process() 如果这将涉及大量复制粘贴是一个丑陋的选择,尽管这听起来像你正在导入的这个模块的架构可能不是非常好(很难确定这么少的上下文)。但在这种情况下,您将不得不使用猴子补丁或完全寻找其他解决方案。
【解决方案2】:

你为什么不试试这样,

>>> import os
>>> os.getcwd()
'/home/sivacn'
>>> 
>>> def getcwd():
...     return 'Patched'
... 
>>> os.getcwd = getcwd
>>> 
>>> os.getcwd()
'Patched'
>>> 

【讨论】:

  • 你认为即使在模块被导入内存后这也能工作?
猜你喜欢
  • 2016-12-06
  • 2015-03-10
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 2017-05-10
  • 2014-07-04
相关资源
最近更新 更多