首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Monkey patch Python类

Monkey patch Python类
EN

Stack Overflow用户
提问于 2010-09-22 07:28:22
回答 4查看 38.8K关注 0票数 56

我有一个类,位于一个单独的模块中,我不能更改它。

代码语言:javascript
复制
from module import MyClass

class ReplaceClass(object)
  ...

MyClass = ReplaceClass

这不会更改MyClass anywhere,但会更改此文件。但是,如果我要添加如下所示的方法

代码语言:javascript
复制
def bar():
   print 123

MyClass.foo = bar

这将会起作用,foo方法将在其他任何地方都可用。

我如何完全替换这个类?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-09-22 07:30:30

代码语言:javascript
复制
import module
class ReplaceClass(object):
    ....
module.MyClass = ReplaceClass
票数 71
EN

Stack Overflow用户

发布于 2010-09-22 07:33:25

当您最需要的是限定的名称时,请避免使用from ... import (可怕的;-)方式来获取栏名称。一旦你以正确的Pythonic方式做事情:

代码语言:javascript
复制
import module

class ReplaceClass(object): ...

module.MyClass = ReplaceClass

这样,您就可以手动匹配模块的对象,这是您需要的,当该模块用于其他模块时,该对象将会起作用。使用from ...表单,您只是没有模块对象(查看大多数人使用from ...的明显缺陷的一种方法),因此您的情况显然更糟;-);

我推荐使用from语句的一种方式是从包中导入模块:

代码语言:javascript
复制
from some.package.here import amodule

因此,您仍将获取模块对象,并将对该模块中的所有名称使用限定名称。

票数 33
EN

Stack Overflow用户

发布于 2011-10-20 09:38:56

我只是一只蛋。。。。对于非新手来说,这可能是显而易见的,但我需要from some.package.module import module的习惯用法。

我不得不修改GenerallyHelpfulClass的一个方法。这失败了:

代码语言:javascript
复制
import some.package.module

class SpeciallyHelpfulClass(some.package.module.GenerallyHelpfulClass): 
    def general_method(self):...

some.package.module.GenerallyHelpfulClass = SpeciallyHelpfulClass

代码运行了,但没有使用重载到SpeciallyHelpfulClass上的行为。

这是可行的:

代码语言:javascript
复制
from some.package import module

class SpeciallyHelpfulClass(module.GenerallyHelpfulClass): 
    def general_method(self):...

module.GenerallyHelpfulClass = SpeciallyHelpfulClass

我推测,正如亚历克斯所写的那样,from ... import惯用法“获得了模块”,因为它将被包中的其他模块所采用。进一步推测,较长的点引用似乎将模块带入到具有import by long dotted引用的名称空间中,但不会更改其他名称空间使用的模块。因此,对导入模块的更改只会出现在它们所在的名称空间中。这就好像有两个相同模块的副本,每个副本都在略有不同的引用下。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3765222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档