我有一个类,位于一个单独的模块中,我无法更改。
from module import MyClass
class ReplaceClass(object)
...
MyClass = ReplaceClass
除了这个文件,这不会改变 MyClass 其他任何地方。但是,如果我要添加这样的方法
def bar():
print 123
MyClass.foo = bar
这将起作用,并且 foo 方法将在其他任何地方可用。
如何完全替换课程?
我有一个类,位于一个单独的模块中,我无法更改。
from module import MyClass
class ReplaceClass(object)
...
MyClass = ReplaceClass
除了这个文件,这不会改变 MyClass 其他任何地方。但是,如果我要添加这样的方法
def bar():
print 123
MyClass.foo = bar
这将起作用,并且 foo 方法将在其他任何地方可用。
如何完全替换课程?
import module
class ReplaceClass(object):
....
module.MyClass = ReplaceClass
当您最需要的是限定名称时,请避免使用from ... import
(可怕的;-)获取准名称的方法。一旦你以正确的 Pythonic 方式做事:
import module
class ReplaceClass(object): ...
module.MyClass = ReplaceClass
这样,您正在对模块对象进行猴子修补,这是您需要的并且当该模块用于其他人时将起作用。使用表单,您只是from ...
没有模块对象(查看大多数人使用的明显缺陷的一种方式),因此您的情况显然更糟;-);from ...
我推荐使用该from
语句的一种方法是从包中导入模块:
from some.package.here import amodule
所以你仍然得到模块对象,并将使用限定名称来表示该模块中的所有名称。
我不过是个鸡蛋。. . . 也许对非新手来说很明显,但我需要这个from some.package.module import module
成语。
我不得不修改 GeneralHelpfulClass 的一种方法。这失败了:
import some.package.module
class SpeciallyHelpfulClass(some.package.module.GenerallyHelpfulClass):
def general_method(self):...
some.package.module.GenerallyHelpfulClass = SpeciallyHelpfulClass
代码运行了,但没有使用重载到 SpeciallyHelpfulClass 的行为。
这有效:
from some.package import module
class SpeciallyHelpfulClass(module.GenerallyHelpfulClass):
def general_method(self):...
module.GenerallyHelpfulClass = SpeciallyHelpfulClass
我推测from ... import
成语“获取模块”,正如亚历克斯所写的那样,因为它将被包中的其他模块拾取。进一步推测,较长的虚线引用似乎将模块带入了通过长虚线引用导入的名称空间,但不会更改其他名称空间使用的模块。因此,对导入模块的更改只会出现在进行更改的名称空间中。就好像同一个模块有两个副本,每个副本在略有不同的引用下可用。
import some_module_name
class MyClass(object):
... #copy/paste source class and update/add your logic
some_module_name.MyClass = MyClass
替换时最好不要更改类的名称,因为不知何故有人可能使用 getattr 引用了它们 - 这将导致如下所示的失败
getattr(some_module_name, 'MyClass')
--> 如果您将 MyClass 替换为 ReplaceClass ,这将失败!