【问题标题】:In python, can I reload methods in a classes that's running?在 python 中,我可以重新加载正在运行的类中的方法吗?
【发布时间】:2012-03-07 08:57:31
【问题描述】:

好的,我一直在创建一个供个人使用的 python IRC 机器人,我正在尝试创建一个命令,该命令重新加载一个辅助解析器,该解析器检查 irc 数据中是否有对机器人的命令(主解析器只检查 PING ,以及退出/重新加载命令)。

当类作为对象运行时,有没有办法从方法中重新加载代码?

这是迄今为止完整代码的链接(缺少很多命令):pastebin link

编辑:这些代码融合了网上许多不同的东西,以及我一直在玩的东西,所以如果你有任何代码优化(这解释了代码中奇怪的 cmets),他们会受到欢迎也是。

【问题讨论】:

    标签: python irc bots


    【解决方案1】:

    在 Python 中更改现有对象的代码是不可能的。您应该重新启动该过程。

    人们尝试各种方案来实现它,但这并不值得。仅仅再次导入模块是行不通的,因为 N 个导入会导致文件被执行一次,并且所有导入都引用同一个模块对象。

    如果您尝试破坏sys.modules 缓存以使导入真正再次加载文件,您仍然不会更改现有对象引用的代码。他们仍然会指向原始的类和方法。重新加载后创建的新对象会有新的代码,但是很难摆脱你在第一次加载模块时创建的所有对象。

    【讨论】:

    • 事实上并非不可能。是的,Hackish 和不明智的,是的。但这是可以做到的。
    • reload() 内置函数为例。
    • @KarlKnechtel:你试过使用它吗?它不会尝试更改已创建的对象。
    • 这是真的。我误解了“更改现有对象的代码”。
    • 谢谢,我选择了简单的选项并使用更新的代码重新创建了类
    【解决方案2】:

    一个程序可以用另一个函数或方法覆盖一个函数或方法:

    def newparser(self, s):
        print s, s
    
    myobject.parser = newparser
    myobject.parser("hello") # prints "hello hello"
    

    但我同意,这不是一个好主意。我很确定你不需要做这样的事情。

    【讨论】:

    • 谢谢,我刚刚在关闭 irc 连接后创建了一个新的类实例,尽管您的示例在程序的不同部分可能很有用
    猜你喜欢
    • 2018-05-25
    • 2012-06-02
    • 2018-08-28
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多