V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
shyrock
V2EX  ›  Python

如何不修改原始文件而改变库代码的行为?

  •  
  •   shyrock · 2021-09-29 11:29:53 +08:00 · 1596 次点击
    这是一个创建于 940 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如我用的框架库里有个 expression 类,我发现这个类有个 bug,如果我直接修改这个类可以修复 bug 。
    但是因为这个类并不在我的源代码管理中,而是定期从厂商那里获取新版本更新的,
    所以我希望在我的代码里面加入一个补丁来修改框架库中 expression 类的行为。

    有一些情况我认为可以使用猴子补丁,那就是 expression 类生成了全局对象,通过在运行期修改这个对象就可以修改系统的行为。
    可是如果其他代码都是局部调用 expression 类生成临时对象的话,猴子补丁就没效果了。

    求各位彦祖指点。
    deplivesb
        1
    deplivesb  
       2021-09-29 11:39:28 +08:00
    直接在 globals 替换掉 expression ? 我不知道这样可行不
    shyrock
        2
    shyrock  
    OP
       2021-09-29 11:41:38 +08:00
    @zhangdeplives #1 能否具体一点?
    wenqiang1208
        3
    wenqiang1208  
       2021-09-29 16:44:15 +08:00   ❤️ 1
    猴子补丁,在项目启动时,执行一下, 项目中所有引用的地方 就可以生效
    shyrock
        4
    shyrock  
    OP
       2021-09-29 16:55:39 +08:00
    @wenqiang1208 #3 对的。我之前对猴子补丁的理解狭隘了。
    猴子补丁既可以应用于对象,也可以应用于类。
    在应用于类的情况下,是可以全局起效的,并且对模块加载顺序无要求。

    结帖。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5382 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 07:25 · PVG 15:25 · LAX 00:25 · JFK 03:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.